Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript setTimeout的最小毫秒值是多少?_Javascript_Timer_Cross Browser_Settimeout - Fatal编程技术网

Javascript setTimeout的最小毫秒值是多少?

Javascript setTimeout的最小毫秒值是多少?,javascript,timer,cross-browser,settimeout,Javascript,Timer,Cross Browser,Settimeout,我想把 var minValue = 0; if ( typeof callback == 'function' ) { setTimeout( callback, minValue ); } 这段代码是我用JavaScript实现回调函数时编写的 但我发现现代浏览器和一些旧浏览器 具有不同的最小超时值 我知道零不能是最小值 设置超时的最小值是多少 现代浏览器和一些旧浏览器的兼容性问题?我认为10将是所有浏览器中最可靠的最小值,因为我见过很多使用它的代码 但是, 事实上,4ms是由HT

我想把

var minValue = 0;
if ( typeof callback == 'function' ) {
    setTimeout( callback, minValue );
}
这段代码是我用JavaScript实现回调函数时编写的

但我发现现代浏览器和一些旧浏览器

具有不同的最小超时值

我知道零不能是最小值

设置超时的最小值是多少


现代浏览器和一些旧浏览器的兼容性问题?

我认为10将是所有浏览器中最可靠的最小值,因为我见过很多使用它的代码

但是,

事实上,4ms是由HTML5规范指定的,在2010年及以后发布的浏览器中是一致的。在(Firefox 5.0/Thunderbird 5.0/SeaMonkey 2.2)之前,嵌套超时的最小超时值为10毫秒


在现代浏览器中,最小值是4ms(从HTML5开始),在此之前,最小值是10ms。请注意,这些时间永远不会100%准确。

本文测试Firefox、Safari和Opera并绘制性能图:

Firefox2、Opera和Safari都有10毫秒的底部延迟窗口

对于较旧的浏览器,您可以执行类似于本文中的测试。我刚刚在IE6中使用10ms的间隔运行了一个我不久前做的
setInterval
测试,平均得到了55ms<代码>设置超时似乎低于35毫秒

我在Chromium中运行了测试,在10毫秒的超时时间内平均得到11毫秒。我尝试了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>

//计算平均值之前调用setTimeout的次数
var迭代次数=200;
window.onload=函数()
{
testTimeout(10,+新日期,0,0);
}
//以指定的间隔重复调用setTimeout,跟踪金额
//连续调用之间经过的时间
函数testTimeout(间隔、最后一次、总和、ii)
{
var时间=+新日期;
var差异=时间-最后一次;
和=差;
如果(ii%迭代==1)
{
document.body.innerHTML=总和/迭代次数;
总和=0;
}
window.setTimeout(
函数(){
testTimeout(间隔、时间、总和,ii+1)
},间隔);
}

设置超时
很可能正在调用

setTimeout
的实际机制(包括最小毫秒数)是专有的和/或系统相关的,因为它们不在官方ECMA规范中。这取决于Javascript运行时以及运行它的系统。鉴于Javascript运行时不会增加大量开销,最小毫秒数由操作系统和硬件的时间片分辨率决定。最小的“可睡眠”时间量通常是系统的另一个进程分配给另一个进程所需的时间

例如,在Windows(后XP)上,显示:

值为零时,线程将放弃其剩余部分 将时间片复制到准备运行的任何其他线程。如果没有 其他线程准备运行时,函数立即返回 线程继续执行


这意味着,在某些极为罕见的情况下,如果当前没有其他进程在Javascript运行时运行的服务器上等待,则调用程序执行完毕后,它可能会立即继续,具体取决于Javascript运行时的实现方式。不过,您可能不会经常观察到这种情况:)

。尽管您指定的任何时间都不可靠。您始终可以编写一个测试…@bradcristie您如何测试JavaScript代码?TDD?对不起,这不是真的(不再是?)。我只是在中找不到关于4ms延迟的陈述,除了一条注释:“注意:计时器可以嵌套;但是,在五个这样的嵌套计时器之后,间隔必须至少为4毫秒。”进一步的好奇让我在google Group上找到了他们在Chrome中是如何做到这一点的。@TobbeBrolin这在实现中是否正确,:“如果当前正在运行的任务是由setTimeout()方法创建的任务,并且超时值小于4,则将超时值增加到4。”@Tobbebroblin然而,我没有看到WHATWG规范中反映的langauge。看起来W3C和WHATWG在这一点上存在分歧。因此,如果嵌套级别小于5,则最低值为“1 ms”“在Chrome中,我必须承认这个答案无法说服我,因为它与我所知道的javascirpt(主要是)基于事件的单线程执行不符。您能指出任何关于js实现调用
sleep
的引用吗?“它可能会立即继续,这取决于Javascript运行时的实现方式。”-如果运行时实现正确,则在当前代码完成执行之前,超时不会运行-即使指定时间为0,它仍将排队。我对此深表怀疑。特别是
sleep
|
sleep
系统调用与此相关。我认为javascript有自己的调度机制,粒度最终取决于语言的特定浏览器实现。但是javascript是基于事件的,我认为它将检查循环中的事件,并检查是否有任何已计划和“过期”的事件执行它们。这就是它不准确的原因(在这种情况下,毫秒是很大的,所以准确度应该是预期的),也是为什么
setTimeout()
的时间参数应该有一个限制。4ms延迟仅适用于从5个嵌套级别进行调用的情况。