以无限次异步执行函数的最快方法是什么?延迟多次调用函数的最快方法
我想到了2种方法来做到这一点。
使用间隔
setInterval(function(){
// do stuff
})
使用而
setTimeout(function(){
while(true) {
// do stuff
}
})
我应该如何处理这个问题,以获得最快的结果可能吗? 我不在乎启动循环的时间。我只关心完成循环所需的时间。
以无限次异步执行函数的最快方法是什么?延迟多次调用函数的最快方法
我想到了2种方法来做到这一点。
使用间隔
setInterval(function(){
// do stuff
})
使用而
setTimeout(function(){
while(true) {
// do stuff
}
})
我应该如何处理这个问题,以获得最快的结果可能吗? 我不在乎启动循环的时间。我只关心完成循环所需的时间。
function foo(){
// do stuff
setTimeout(foo, 0);
}
foo();
setInterval
有排队调用你的函数的数百或数千,如果他们需要更长的时间比间隔时间来运行,有效地阻止了可能性。你的while循环不是异步的,除了第一次调用。
那么,你的例子在第一次运行时不是异步的。但主要想法在这里。谢谢:) – 2014-09-12 23:41:57
浏览器似乎不再容易堆叠,并且没有“阻塞队列”:http://jsfiddle.net/gomq31gr/ – user2864740 2014-09-12 23:44:09
当正确编码为时,setInterval和setTimeout都将具有相同的“最快”方法。
但是,在循环中的示例是错误在比较的上下文中并冻结浏览器(因为循环不再是异步构造)。应该不是被写入再次调用setTimout,如图所示:
setTimeout(function fn() {
setTimeout(fn, 0); // loop is implicit with scheduling next timeout
code();
}, 0);
现在是相当于到:
setInterval(function() { code() }, 0);
虽然可能已产生了效果在过去它No Longer Matters - 两种方法在调用回调的速度和降低下一个事件的速度方面具有相同的下限,这是一个迷你在Windows桌面浏览器中约4-5毫秒。
因为这是一个固定的下限往往是值得处理多个项目每个回调(说“做20毫秒的工作价值”),使得超时/延迟本身并不占主导地位的总时间。也有可能Run Multiple "Parallel" Timeouts增加执行共享回调的有效率;然而,这样的事件不能保证分散。
现代浏览器也Not Affected by "setTimeout Stacking";因此为了尽可能快地运行回调,任何一种方法都是很好的。
因此,使用最好的方法代表问题。
使用'requestAnimationFrame'? – elclanrs 2014-09-12 23:26:41
@elclanrs - 回答完全不同的问题。 @Afonso - 你的timeout + while循环除了第一次调用外不是异步的。把'setTimeout(thisFn)'调用_inside_函数 – 2014-09-12 23:27:52
你应该实现几种不同的方法并测量每个方法的时间。 – 2014-09-12 23:27:55