<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<select>
<option>1 поток</option>
<option>2 потока</option>
<option>3 потока</option>
<option>4 потока</option>
<option>5 потоков</option>
<option>6 потоков</option>
<option>7 потоков</option>
<option>8 потоков</option>
<option>9 потоков</option>
<option>10 потоков</option>
<option>11 потоков</option>
<option>12 потоков</option>
<option>13 потоков</option>
<option>14 потоков</option>
<option>15 потоков</option>
<option>16 потоков</option>
<option>17 потоков</option>
<option>18 потоков</option>
<option>19 потоков</option>
<option>20 потоков</option>
</select>
<button>Старт</button>
<script>
var sel = document.querySelector('select');
document.querySelector('button').onclick = ()=> {
var potok = sel.selectedIndex+1, flag = 0,
time = performance.now(),
work = [], end = [];
for (var i = 0; i < potok; i++){
work[i] = new Worker(URL.createObjectURL(new Blob([workerRunner.toString().replace(/^function .+\{?|\}$/g, '')],{ type:'text/javascript' })));
end[i] = 0;
}
work.forEach((el,i)=>{
el.postMessage([potok, i]);
el.onmessage=e=>{
end[i] = e.data;
if(!end.includes(0)) {
el.terminate();
time = performance.now() - time;
console.log('Время выполнения = ', time);
}
};
});
};
function workerRunner() {
self.onmessage = e => {
w = 1000000000,
a1 = Math.floor(w/e.data[0]*e.data[1]),
a2 = Math.floor(w/e.data[0]*(e.data[1]+1));
for(var i = a1; i<a2; i++) Math.random();
self.postMessage(1);
};
}
</script>
</body>
</html>
результат радует 90-120 мс выполняется в FF (у меня)
потоки лучше всего устанавливать в соответствии с количеством физических ядер
Если установить максимальное количество потоков CPU грузится на 100%