Кажется, я не могу найти определенный ответ нигде.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. Я очень хочу понять, что такое рабочие и нет. У них есть некоторая нечетная оценка производительности при запуске сборщика мусора? Если да, то как вы управляете памятью таким образом, чтобы избежать таких узких мест?
Возможно, это не важно, но я замечаю, что функции не совсем идентичны. Рабочая версия использует 'e.data', а основной поток - один' j'. Также было бы хорошо знать, в каком браузере вы это использовали. –
Использование 'e.data' является виновником, если вы кешируете его в переменной, он работает примерно так же быстро, как встроенный скрипт (по крайней мере, в Chrome). – robertklep
@robertklep Вы правы! Почему это вызывает столько неприятностей? Итерирует ли это событие как-то? нотабене это произошло в Chrome. – dzh