嗯,有 setImmediate()
可以立即运行代码,就像你期望使用 setTimeout(0)
时的效果。
区别在于,setTimeout(0)
实际上并不会立即运行;setTimeout
被“夹紧”到最小等待时间(4ms),这就是为什么你在测试程序中只得到了250个计数器的原因。 setImmediate()
真的会立即运行,因此使用它进行计数测试将获得数量级更高的结果。
但是,您可能需要检查浏览器是否支持 setImmediate
-- 它还没有在所有浏览器中提供。 (当然,您可以使用 setTimeout(0)
作为后备,但这样就回到了它所施加的最小等待时间)。
postMessage()
也是一种选择,可以实现几乎相同的结果,尽管它是一个更复杂的API,因为它旨在做比简单的调用循环更多的事情。此外,在使用它时需要考虑其他因素(请参阅链接的MDN文章以获取更多信息)。
MDN网站还提到了用于 setImmediate
的polyfill库,它使用postMessage
和其他技术将setImmediate
添加到尚未支持它的浏览器中。
使用requestAnimationFrame()
,您应该得到60个计数器的结果,因为这是每秒帧数的标准值。如果你得到的比这多,那么你的程序可能运行了超过一秒。
你永远无法使用它获得高计数测试数字,因为它只会每秒触发60次(如果硬件刷新帧率由于某种原因更低,则可能更少)。但是,如果你的任务涉及更新显示,则这就足够了,因此你可以使用
requestAnimationFrame()
来限制它被调用的次数,从而释放程序中其他任务所需的资源。
这就是为什么存在
requestAnimationFrame()
的原因。如果你只关心让你的代码尽可能经常运行,那么不要使用
requestAnimationFrame()
;改用
setTimeout
或
setImmediate
。但这并不一定是性能最好的选择,因为它会占用浏览器需要用于其他任务的处理器资源。
归根结底,性能不仅仅是让某些东西尽可能多地运行;它还是使用户体验尽可能流畅。而这通常意味着对你的调用循环施加限制。
postMessage
的这个hack:http://codepen.io/anon/pen/wczFv - DogbertsetTimeout
在大多数浏览器中的最小时间间隔为4毫秒,这就解释了为什么你得到的值约为250。 - Qantas 94 Heavy