2014-09-12 62 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";因此爲了儘可能快地運行回調,任何一種方法都是很好的。

因此,使用最好的方法代表問題。