JavaScriptで利用可能なCPUコアの数を決定して、それに応じてWebワーカーの数を調整できる方法はありますか?
はい、 navigator.hardwareConcurrency です。 Chrome、Firefox、Edge、Opera、およびWebkitでネイティブにサポートされます。 a polyfill を使用するすべてのブラウザーでサポートされます。
いいえ、ActiveXを使用しない限り、ありません。
次のようにしてコアの数を推定することができます: https://github.com/oftn/core-estimator
デモ: http://eligrey.com/blog/post/cpu-core-estimation-with-javascript
ここに私が一緒にハッキングしたかなり速い並行性推定があります...それはまだ多くのテストを受けていません:
ワーカーが実行するコードは次のとおりです(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'}));
見積もりツールには、短時間(4ms)実行される多数のワーカーがあり、実行時間を報告します(残念ながら、performance.now()は、より正確なタイミングを得るためにWebワーカーで使用できません)。次に、メインスレッドは、同時に実行されていたワーカーの最大数を確認します。このテストは何度も繰り返され、適切なサンプルを取得して推定値を生成します。
したがって、主な考え方は、作業が十分に小さい場合、その動作をサポートするのに十分なコアがある場合にのみ、ワーカーが同時に実行されるようにスケジュールすることです。これはあくまでも推定値ですが、これまでのところ、テストしたいくつかのマシンではかなり正確です。これは、私のユースケースでは十分です。サンプル数を増やして、より正確な概算を得ることができます。私は10を使用していますが、それは迅速であり、作業を完了するだけでなく、見積もりに時間を費やしたくないからです。
ワーカーでデータ処理を行う場合は、navigator.hardwareConcurrency
は、最新のブラウザーでは論理コアの数を返すため、十分ではない可能性があります。物理コアの数を推定するには、 WebCP を使用します。
import {WebCPU} from 'webcpu';
WebCPU.detectCPU().then(result => {
console.log(`Reported Cores: ${result.reportedCores}`);
console.log(`Estimated Idle Cores: ${result.estimatedIdleCores}`);
console.log(`Estimated Physical Cores: ${result.estimatedPhysicalCores}`);
});