因为原测试发生在13年,所以近日(14年3月31日),依据浏览器实测情况调整了文后的表格。
原文来自stackoverflow题目:浏览器在标签页/窗口闲置的时刻,浏览器停息js吗?。采用的回复中有两个测试,特地测试了requestAnimationFrame
和setInterval
在各个场景下的时候距离,测试历程和效果都值得相识。
<翻译>
测试一
我写了一个测试《帧率散布:setInterval VS requestAnimationFrame》。
注重:测试效果跟CPU有很大关联。同时,requestAnimationFrame
在桌面端IE10+上才最先支撑,同时Opera不支撑requestAnimationFrame(译注:原文的兼容性相关内容已过期,这里运用canIuse的结论。)
这个测试纪录下了setInterval
和requestAnimationFrame
在差别浏览器下运转的真正耗时,同时展现他们的数据散布。你能够转变setInterval
的毫秒值来看看差别的效果。
setTimeout
和setInterval
在耽误方面行动相似。而requestAnimationFrame
在差别(支撑的)浏览器中,整体来讲维持在了60fps高低。
若想看看切换到一个差别的标签/或许让窗口闲置的效果,直接翻开(我写的测试)页面,切换到别的一个标签中,守候一阵子。它会纪录在标签页闲置时的真正耗时。
测试二:
另一种测试的计划是在setInterval
和requestAnimationFrame
中反复地纪录timestamp值,在自力的console窗口中检察效果。你能够看到,在你闲置标签页或许窗口时,它更新的有多频仍(假如它有更新的话)。
-
setInterval
的测试页
http://jsfiddle.net/laucheukhim/Aev79/ -
requestAnimationFrame
的测试页
http://jsfiddle.net/laucheukhim/WfdnM/1/
效果:
Internet Explorer
在窗口/标签页闲置时,IE对setInterval
的延时不作限定;但是IE10+(译注,原文是IE10,本人IE11测试也是一样的效果)在标签页闲置时停息了响应的requestAnimationFrame
,不管窗口是不是闲置。
Safari
Safari在窗口/标签页闲置时不停息setInterval
,它依旧以一般频次反复运转(setInterval
的函数)。在标签页闲置时,requestAnimationFrame
停息了。
Firefox
Firefox在标签页闲置时,将setInterval
的时候距离限定在1000ms摆布。假如时候距离高于1000ms,则没有响应限定。不管窗口有无闲置,只需你切换到差别的标签页,setInterval
的时候距离就会被限定。
在标签页闲置时,requestAnimationFrame
的时候距离被限定在1-3秒一帧。
源码:
// The default shortest interval/timeout we permit
#define DEFAULT_MIN_TIMEOUT_VALUE 4 // 4ms
#define DEFAULT_MIN_BACKGROUND_TIMEOUT_VALUE 1000 // 1000ms
Chrome
与Firefox行动相似,在标签页闲置的时刻,Chrome将setInterval
最小的时候距离闲置在1000ms摆布。requestAnimationFrame
在标签页闲置的时刻被完整停息。
源码:
// Provides control over the minimum timer interval for background tabs.
const double kBackgroundTabTimerInterval = 1.0;
Opera
Opera在标签页闲置的时刻不作setInterval
的限定。
requestAnimationFrame 不被支撑。在标签页闲置时,requestAnimationFrame
停息。(译注:因为新版Opera已支撑了requestAnimationFrame
,这里是本人的测试效果。)
总结
标签页闲置时,时候距离:
setInterval | requestAnimationFrame | |
IE10+ | 待测试 | 停息 |
IE9- | 无影响 | 不支撑 |
Safari | 无影响>=1s | 停息 |
Firefox | >=1s | 1s – 3s |
Chrome | >=1s | 停息 |
Opera | 无影响>=1s | 不支撑 停息 |
</翻译>
扩大浏览:
- 张鑫旭的关于
requestAnimationFrame
的polyfill和运用的一篇文章:《CSS3动画那末强,requestAnimationFrame另有毛线用?》 - 深切
requestAnimationFrame
的机制:《明白WebKit和Chromium: 衬着主轮回(main loop)和requestAnimationFrame》