Вот довольно быстрая оценка параллелизма, которую я взломал вместе ... она еще не прошла много испытаний:
http://jsfiddle.net/Ma4YT/2/
Вот код, который запускают рабочие (так как у меня есть ссылка на jsfiddle, необходим образец):
// create worker concurrency estimation code as blob
var blobUrl = URL.createObjectURL(new Blob(['(',
function() {
self.addEventListener('message', function(e) {
// run worker for 4 ms
var st = Date.now();
var et = st + 4;
while(Date.now() < et);
self.postMessage({st: st, et: et});
});
}.toString(),
')()'], {type: 'application/javascript'}));
Оценщик имеет большое количество рабочих, выполняемых в течение короткого периода времени (4 мс), и отчитывается о времени, которое они выполняли (к сожалению, performance.now () недоступен в Web Workers для более точной синхронизации). Затем основной поток проверяет максимальное количество рабочих, которые работали за одно и то же время. Этот тест повторяется несколько раз, чтобы получить достойную выборку для оценки с.
Таким образом, основная идея заключается в том, что, учитывая достаточно небольшой объем работы, рабочие должны планироваться для одновременного запуска только при наличии достаточного количества ядер для поддержки такого поведения. Это, очевидно, просто оценка, но до сих пор она была достаточно точной для нескольких машин, которые я тестировал, что вполне достаточно для моего варианта использования. Количество образцов может быть увеличено, чтобы получить более точное приближение; Я просто использую 10, потому что это быстро, и я не хочу тратить время на оценку, а просто на выполнение работы.