2016-06-23 16 views
6

Ich kann nirgendwo eine definitive Antwort finden.Web Worker 20x schlechtere Leistung

Ich habe sehr einfache POC, die die gleiche Funktion in Sync-und Async-Mode berechnet.

Worker.js

onmessage = function(e) { 
    var s = new Date().getTime(); 
    i = 0; 
    var avg = Math.random(); 
    while (i < e.data){ 
    avg = (avg + Math.random())/2 ; 
    i++; 
    } 
    var d = new Date().getTime(); 
    console.log('Duration ' + (d - s)); 
    postMessage(avg); 
} 

Index.HTML

<script> 
var mw = new Worker("worker.js"); 

mw.onmessage = function(e) { 
    console.log('Worker says: ' + e.data); 
    }; 

function av (j){ 
    var s = new Date().getTime(); 
    i = 0; 
    var avg = Math.random(); 
    while (i < j){ 
    avg = (avg + Math.random())/2 ; 
    i++; 
    } 
    var d = new Date().getTime(); 
    console.log('Result is ' + avg); 
    console.log('Duration ' + (d - s)); 
} 



function runSync(){ 
    av(100000000); 
} 
function runAsync(){ 
    mw.postMessage(100000000); 
} 

</script> 

    <a href="#" onClick="runSync()" /> Run Sync </a> 

    <a href="#" onClick="runAsync()" /> Run Async </a> 

Auf meinem 4-Kern-MacBook dies erzeugt:

Result is 0.47398200501358567 
Duration 985 
Duration 23187 
Worker says: 0.7422913957976759 

Wie Sie Web-Arbeiter 20x länger dauert Prozess sehen . Was ist die Erklärung dafür? Andere verwandte Beiträge vorgeschlagen Garbage Collection und Heap, aber dann fand der Täter, um einige API-Problem sein. Ich möchte verstehen, was Arbeiter sind und was nicht. Haben sie eine merkwürdige Leistungseinbuße, wenn der Garbage Collector ausgeführt wird? Wenn ja, wie verwalten Sie Speicher so, dass Sie solche Engpässe vermeiden können?

+5

Es mag nicht wichtig sein, aber ich bemerke, dass die Funktionen nicht genau identisch sind. Die Worker-Version verwendet 'e.data', während der Hauptthread ein' j' ist. Es wäre auch gut zu wissen, in welchem ​​Browser Sie das ausgeführt haben. –

+5

Die Verwendung von 'e.data' ist der Übeltäter, wenn Sie es in einer Variablen zwischenspeichern, läuft es ungefähr so ​​schnell wie das inline Skript (zumindest in Chrome). – robertklep

+0

@robertklep Sie sind richtig! Warum verursacht das so viel Ärger? Wird das Stack durch das Iterationsthru Event irgendwie vergrößert? n.b. Dies lief auf Chrome. – dzh

Antwort

0

Sie sind nicht genau die gleiche Funktion, Sie sind e.data in der Arbeiter, die es ist viel langsamer als Zugriff auf die im Cache j direkt, wenn Sie das ändern, sollten sie etwa zur gleichen Zeit.