JavaScript で使用可能な CPU コアの数を判断して、それに応じて Web ワーカーの数を調整する方法はありますか?
5 に答える
はい。MDN を引用するには:
navigator.hardwareConcurrency
読み取り専用プロパティは、ユーザーのコンピューターでスレッドを実行するために使用できる論理プロセッサの数を返します…</p >最近のコンピューターは、CPU に複数の物理プロセッサ コア (通常は 2 つまたは 4 つのコア) を備えていますが、通常、各物理コアは、高度なスケジューリング手法を使用して、一度に複数のスレッドを実行することもできます。たとえば、4 コアの CPU は 8 つの論理プロセッサ コアを提供する場合があります。論理プロセッサ コアの数を使用して、コンテキスト スイッチなしで一度に効果的に実行できるスレッドの数を測定できます。
ただし、ブラウザーは、一度に実行できるワーカーの数をより正確に表すために、より少ない数の論理コアを報告することを選択する場合があるため、これをユーザーのシステムのコア数の絶対的な測定値として扱わないでください。 .
Internet Explorer を除くすべてのブラウザーでサポートされています。そのために、ポリフィルcore-estimator
( demo、ブログ投稿) を使用できます。
いいえ、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'}));
estimator は多数のワーカーを短時間 (4 ミリ秒) 実行し、それらが実行された時間を報告します (残念ながら、Web ワーカーではより正確なタイミングのために performance.now() を使用できません)。次に、メイン スレッドは、同時に実行されていたワーカーの最大数をチェックします。このテストは、適切なサンプルを取得して見積もりを作成するために何度も繰り返されます。
したがって、主な考え方は、作業のチャンクが十分に小さい場合、その動作をサポートするのに十分なコアがある場合にのみ、ワーカーを同時に実行するようにスケジュールする必要があるということです。これは明らかに単なる見積もりですが、これまでのところ、私がテストしたいくつかのマシンではかなり正確でした。これは、私のユース ケースでは十分です。サンプル数を増やして、より正確な近似値を得ることができます。私はただ 10 を使用します。これは迅速であり、作業を完了するのではなく見積もりに時間を無駄にしたくないからです。