最快的方式多次调用函数延迟

时间:2014-09-12 23:25:18

标签: javascript loops

异步执行无限次函数的最快方法是什么?

我想到了两种方法。

使用间隔

setInterval(function(){
   // do stuff
})

使用while

setTimeout(function(){
   while(true) {
      // do stuff
   }
})

我应该如何处理以获得最快的结果? 我不在乎开始循环所需的时间。我只关心做循环所需的时间。

3 个答案:

答案 0 :(得分:3)

function foo(){
    // do stuff
    setTimeout( foo, 0 );
}

foo();
如果

setInterval花费的时间超过间隔时间,则可以将数百或数千次调用排入队列,从而有效阻止。你的while循环不是异步,除了第一次调用。

答案 1 :(得分:0)

第二种方式将是最快的。它只需要进入一次事件队列,然后它就会停留在无限循环中。

这将异步运行一个函数,然后它将在运行时阻止UI。如果这不是你想要的,那么这个答案没有帮助。但是我假设你的两个方法都做了你想要的,你只想要最快的循环版本。

答案 2 :(得分:0)

正确编码时,setInterval和setTimeout将具有相同的"最快"方法 1

但是,在比较上下文中,循环的示例是错误并且将冻结浏览器(因为循环不再是异步构造)。应该编写它以再次调用setTimout,如下所示:

setTimeout(function fn () {   
   setTimeout(fn, 0);        // loop is implicit with scheduling next timeout
   code();
}, 0);

现在等效于

setInterval(function () { code() }, 0);

1 虽然它可能在过去它有所不同No Longer Matters - 两种方法都有相同的下限,它们调​​用的速度有多快回调并安排下一个事件,在Windows上的桌面浏览器中至少需要4-5毫秒。

由于这是一个固定的下限,因此处理多个项每次回调通常是值得的(例如"做20毫秒的工作和#34;),这样超时/延迟本身并不占据整体时间。 Run Multiple "Parallel" Timeouts也可以增加执行共享回调的有效速率;但是,这些事件并不能保证分布良好。

现代浏览器也是Not Affected by "setTimeout Stacking";因此,尽可能快地运行回调,任何一种方法都很好。

因此,请使用 best 表示问题的方法。