异步执行无限次函数的最快方法是什么?
我想到了两种方法。
使用间隔
setInterval(function(){
// do stuff
})
使用while
setTimeout(function(){
while(true) {
// do stuff
}
})
我应该如何处理以获得最快的结果? 我不在乎开始循环所需的时间。我只关心做循环所需的时间。
答案 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 表示问题的方法。