2016-06-23 10 views
6

Кажется, я не могу найти определенный ответ нигде.Web Worker 20x хуже производительность

У меня очень простой POC, который вычисляет ту же функцию синхронно и асинхронно.

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> 

На моем 4 ядра MacBook это создает:

Result is 0.47398200501358567 
Duration 985 
Duration 23187 
Worker says: 0.7422913957976759 

Как вы можете видеть, веб-работник принимает 20x больше к процессу , Каково объяснение этого? Другие связанные должности предлагали сбор мусора и кучу, но затем обнаружили, что виновником является какая-то проблема с API. Я очень хочу понять, что такое рабочие и нет. У них есть некоторая нечетная оценка производительности при запуске сборщика мусора? Если да, то как вы управляете памятью таким образом, чтобы избежать таких узких мест?

+5

Возможно, это не важно, но я замечаю, что функции не совсем идентичны. Рабочая версия использует 'e.data', а основной поток - один' j'. Также было бы хорошо знать, в каком браузере вы это использовали. –

+5

Использование 'e.data' является виновником, если вы кешируете его в переменной, он работает примерно так же быстро, как встроенный скрипт (по крайней мере, в Chrome). – robertklep

+0

@robertklep Вы правы! Почему это вызывает столько неприятностей? Итерирует ли это событие как-то? нотабене это произошло в Chrome. – dzh

ответ

0

Они не совсем такие же, вы работаете e.data у работника, который намного медленнее, чем доступ к кешированному j, если вы его измените, они должны заняться примерно в одно и то же время.

Смежные вопросы