我想提出
var minValue = 0;
if ( typeof callback == 'function' ) {
setTimeout( callback, minValue );
}
当我用JavaScript实现回调函数时,这段代码。
但我发现现代浏览器和一些旧浏览器
具有不同的最小超时值。
我知道零不能是最小值。
的setTimeout最小值是多少?
现代浏览器和一些旧浏览器是否存在兼容性问题?
答案 0 :(得分:43)
我认为10将是所有浏览器中最可靠的最小值,因为我已经看到很多代码使用它。
然而,4ms is the minimum for HTML5
事实上,4毫秒是由HTML5规范指定的,并且在2010年及之后发布的浏览器中是一致的。在(Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)之前,嵌套超时的最小超时值为10毫秒。
答案 1 :(得分:9)
在现代浏览器中,最小值是4ms(从HTML5开始),在此之前,它是10ms。请注意,这些时间永远不会100%准确。
答案 2 :(得分:3)
本文测试Firefox,Safari和Opera并绘制性能图:
http://ejohn.org/blog/analyzing-timer-performance/
Firefox 2,Opera和Safari都有一个10毫秒的延迟窗口
对于旧版浏览器,您可以像该文章中那样进行测试。我刚刚在IE6中使用10分钟的间隔运行了setInterval
前一段时间的测试,我的平均值 55ms 。 35ms 时setTimeout
似乎更低。
我在Chromium中运行测试,并且在10毫秒超时时平均 ~11ms 。我用4ms和1ms的间隔尝试了它,两者都得到 ~4.5ms 。另外,请记住,操作系统中的数字可能会有所不同。
如果您有兴趣,这是测试代码:
<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>
答案 3 :(得分:3)
setTimeout
最有可能调用sleep
or Sleep
system call。
setTimeout
的实际机制(包括最小毫秒数)是专有的和/或系统相关的,因为它们不在官方的ECMA规范中。这取决于您的Javascript运行时,以及您运行它的系统。鉴于,您的Javascript运行时不会增加大量开销,最小毫秒数由操作系统和硬件的时间片分辨率决定。最小的“可睡眠”时间通常是系统timeslice为该过程分配另一个scheduling algorithm所需的时间。
在Windows(XP后)上,the documentation for the sleep system call显示:
值为零会导致线程放弃其余部分 时间片到任何其他准备运行的线程。如果没有 其他线程准备运行,函数立即返回,并且 线程继续执行。
这意味着,在一些非常罕见的情况下,当前没有其他进程在hardware thread上等待您的Javascript运行时process正在运行,它可能会在调用者完成后立即继续执行,具体取决于您的Javascript运行时的实现方式。你可能不会经常观察到这种情况:)