我想放
var minValue = 0;
if ( typeof callback == 'function' ) {
setTimeout( callback, minValue );
}
当我用 JavaScript 实现回调函数时的这段代码。
但我发现现代浏览器和一些旧浏览器
有不同的最小超时值。
我知道零不能是最小值。
setTimeout 的最小值是多少
现代浏览器和一些旧浏览器的兼容性问题?
我想放
var minValue = 0;
if ( typeof callback == 'function' ) {
setTimeout( callback, minValue );
}
当我用 JavaScript 实现回调函数时的这段代码。
但我发现现代浏览器和一些旧浏览器
有不同的最小超时值。
我知道零不能是最小值。
setTimeout 的最小值是多少
现代浏览器和一些旧浏览器的兼容性问题?
我认为 10 将是所有浏览器中最可靠的最小值,因为我已经看到很多代码使用它。
事实上,4ms 是由 HTML5 规范指定的,并且在 2010 年及以后发布的浏览器中是一致的。在 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2) 之前,嵌套超时的最小超时值为 10 毫秒。
现代浏览器中的最小值为 4 毫秒(从 HTML5 开始),在此之前为 10 毫秒。请注意,这些时间从来都不是 100% 准确的。
setTimeout
最有可能调用sleep
或Sleep
系统调用。
实际机制,包括最小毫秒数,setTimeout
是专有的和/或系统相关的,因为它们不在官方 ECMA 规范中。这取决于您的 Javascript 运行时,以及您运行它的系统。鉴于您的 Javascript 运行时不会增加大量开销,最小毫秒数取决于您的操作系统和硬件的时间片分辨率。最小的“可休眠”时间通常是系统调度算法为进程分配另一个时间片所需的时间。
例如,在 Windows(XP 后)上,sleep 系统调用的文档显示:
零值会导致线程将其时间片的剩余部分放弃给准备运行的任何其他线程。如果没有其他线程准备运行,则函数立即返回,线程继续执行。
这意味着,在极少数情况下,当前没有其他进程正在等待您的 Javascript 运行时进程正在运行的硬件线程,它可能会在调用者完成执行后立即继续,具体取决于您的 Javascript 运行时被执行。不过,您可能不会经常观察到这种情况:)
本文测试 Firefox、Safari 和 Opera 并绘制性能图:
http://ejohn.org/blog/analyzing-timer-performance/
Firefox 2、Opera 和 Safari 都有 10 毫秒的底部窗口延迟
对于较旧的浏览器,您可以进行类似于该文章中的测试。我刚刚setInterval
在 IE6中使用了 10 毫秒的时间间隔进行了一次测试,结果平均为55毫秒。 setTimeout
似乎在35ms 时更低。
我在 Chromium 中运行了测试,并在10 毫秒的超时时间内获得了大约 11毫秒的平均值。我以 4 毫秒和 1 毫秒的间隔进行了尝试,两者都得到了大约 4.5毫秒。另外,请记住,这些数字可能因操作系统而异。
如果你有兴趣,这里是测试代码:
<script>
// number of times to call setTimeout before calculating average
var ITERATIONS = 200;
window.onload = function()
{
testTimeout(10, +new Date, 0, 0);
}
// calls setTimeout repeatedly at a specified interval, tracking the amount
// of time that passes between successive calls
function testTimeout(interval, last, sum, ii)
{
var time = +new Date;
var difference = time - last;
sum += difference;
if (ii % ITERATIONS == 1)
{
document.body.innerHTML = sum / ITERATIONS;
sum = 0;
}
window.setTimeout(
function() {
testTimeout(interval, time, sum, ii + 1)
}, interval);
}
</script>