2016-04-15 7 views
0

Warum ist setTimeout so nicht performant?Warum ist setTimeout so nicht performant

Ich habe 100 Aufgaben, die jeweils 1ms dauern sollten. Ich verschachtle sie mit requestAnimationFrame, die ungefähr 16ms sein sollte. Also würde ich erwarten, dass 14 bis 16 dieser Aufgaben für jede rAF ausgeführt werden. Stattdessen sehe ich 1-3 pro rAF.

var count = 0; 
 
var limit = 100; 
 

 
function doSomething1ms() { 
 
    var start = performance.now(); 
 
    while (performance.now() - start < 1); 
 
    log("finished: " + count); 
 
    if (++count < limit) { 
 
    setTimeout(doSomething1ms, 0); 
 
    } 
 
} 
 
doSomething1ms(); 
 
    
 
var rafCount = 100; 
 
function raf() { 
 
    log("raf"); 
 
    --rafCount; 
 
    if (rafCount) { 
 
    requestAnimationFrame(raf); 
 
    } 
 
}; 
 
requestAnimationFrame(raf); 
 

 
log("start------------------------"); 
 

 
function log(msg) { 
 
    var div = document.createElement('div'); 
 
    div.appendChild(document.createTextNode(msg)); 
 
    document.body.appendChild(div); 
 
}

+0

Werfen Sie einen Blick auf [Warum in diesem Fall native Versprechen scheint schneller als Callbacks in Chrome zu sein?] (Http://StackOverflow.com/a/22759890/1048572) – Bergi

+0

Leider Versprechen gehen nicht durch die Ereigniswarteschlange so wenn ich verkettete Versprechen verwende, führt raf – gman

+0

nicht aus Ja, aber probiere einige der anderen Techniken aus, die dort verlinkt sind, wie 'postMessage' oder' setImmediate' – Bergi

Antwort

0

Basierend auf bergi Kommentar und Link SetTimeout hat eine Grenze von 4 ms

postmessage Verwendung von I erhalten 7-10 Anrufe pro rAF, die allerdings noch immer weit besser ist, von 16

var count = 0; 
 
var limit = 100; 
 

 
function doSomething1ms() { 
 
    var start = performance.now(); 
 
    while (performance.now() - start < 1); 
 
    log("finished: " + count); 
 
    queueNext(); 
 
} 
 

 
window.addEventListener('message', doSomething1ms); 
 

 
function queueNext() { 
 
    if (++count < limit) { 
 
    window.postMessage({}, "*", []); 
 
    } 
 
} 
 
queueNext(); 
 
    
 
var rafCount = 100; 
 
function raf() { 
 
    log("raf"); 
 
    --rafCount; 
 
    if (rafCount) { 
 
    requestAnimationFrame(raf); 
 
    } 
 
}; 
 
requestAnimationFrame(raf); 
 

 
log("start------------------------"); 
 

 
function log(msg) { 
 
    var div = document.createElement('div'); 
 
    div.appendChild(document.createTextNode(msg)); 
 
    document.body.appendChild(div); 
 
}