2014-09-12 64 views
1

以无限次异步执行函数的最快方法是什么?延迟多次调用函数的最快方法

我想到了2种方法来做到这一点。

使用间隔

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

使用而

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

我应该如何处理这个问题,以获得最快的结果可能吗? 我不在乎启动循环的时间。我只关心完成循环所需的时间。

+1

使用'requestAnimationFrame'? – elclanrs 2014-09-12 23:26:41

+0

@elclanrs - 回答完全不同的问题。 @Afonso - 你的timeout + while循环除了第一次调用外不是异步的。把'setTimeout(thisFn)'调用_inside_函数 – 2014-09-12 23:27:52

+0

你应该实现几种不同的方法并测量每个方法的时间。 – 2014-09-12 23:27:55

回答

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

foo(); 

setInterval有排队调用你的函数的数百或数千,如果他们需要更长的时间比间隔时间来运行,有效地阻止了可能性。你的while循环不是异步的,除了第一次调用。

+0

那么,你的例子在第一次运行时不是异步的。但主要想法在这里。谢谢:) – 2014-09-12 23:41:57

+0

浏览器似乎不再容易堆叠,并且没有“阻塞队列”:http://jsfiddle.net/gomq31gr/ – user2864740 2014-09-12 23:44:09

0

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

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

+0

我的意思是'while'的意思,我打错了“第一个”。 – Barmar 2014-09-12 23:29:27

+0

第二个不是异步的(除了第一个调用) – 2014-09-12 23:31:08

+0

也许我误解了这个问题。 – Barmar 2014-09-12 23:32:12

0

正确编码为时,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";因此为了尽可能快地运行回调,任何一种方法都是很好的。

因此,使用最好的方法代表问题。