Domanda

C'è un modo per determinare il numero di nuclei della CPU disponibili in JavaScript, in modo da poter regolare il numero di lavoratori Web a seconda di quello?

È stato utile?

Soluzione

Sì. Per citare MDN:

.

the navigator.hardwareConcurrency Proprietà di sola lettura Restituisce il Numero di processori logici disponibili per eseguire discussioni sul computer dell'utente ...

I computer moderni hanno più nuclei di processore fisico nella propria CPU (due o quattro core è tipico), ma ciascun nucleo fisico è anche in grado di eseguire più di un thread alla volta utilizzando tecniche di pianificazione avanzate. Quindi una CPU a quattro core può offrire otto nuovi core di processore logici , ad esempio. Il numero di core del processore logico può essere utilizzato per misurare il numero di thread che possono essere eseguiti in modo efficace contemporaneamente senza di loro con l'interruttore di contesto.

Il browser può, tuttavia, scegliere di segnalare un numero inferiore di nuclei logici per rappresentare in modo più accurato il numero di lavoratori che possono essere visualizzati contemporaneamente, quindi non trattarlo come misura assoluta del numero di nuclei in il sistema dell'utente.

È supportato da ogni browser ad eccezione di Internet Explorer. Per quello, puoi usare il PolyFill core-estimator ( demo , Blog Post ).

Altri suggerimenti

No, non c'è, a meno che tu non usi alcuni ActiveX.

Ecco uno stimatore di concorrenza abbastanza rapido che ho violato insieme ... Non ha ancora subito un test molto test:

http://jsfiddle.net/ma4yt/2/

Ecco il codice che i lavoratori funzionano (dal momento che ho un collegamento JSFIDDLE è necessario un campione):


// 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'}));
.

Lo stimatore ha un gran numero di lavoratori eseguito per un breve periodo di tempo (4ms) e riferiscono i tempi che hanno corso (sfortunatamente, perfortunatamente. Ora () non è disponibile nei lavoratori web per tempi più accurati). Il thread principale controlla quindi il numero massimo di lavoratori che erano in esecuzione durante lo stesso tempo. Questo test viene ripetuto un numero di volte per ottenere un campione decente per produrre una stima con.

Quindi l'idea principale è che, dato un piccolo pezzo di lavoro sufficiente, i lavoratori dovrebbero essere programmati solo per funzionare allo stesso tempo se ci sono abbastanza nuclei per supportare quel comportamento. È ovviamente solo una stima, ma finora è stata ragionevolmente accurata per alcune macchine che ho testato, il che è abbastanza buono per il mio caso d'uso. Il numero di campioni può essere aumentato per ottenere un'approssimazione più accurata; Uso solo 10 perché è veloce e non voglio perdere tempo a stimare il tempo.

Se hai intenzione di fare i dati scricchiolare sui tuoi lavoratori, navigator.hardwareConcurrency potrebbe non essere abbastanza buono in quanto restituisce il numero di nuclei logici nei browser moderni, potresti provare a stimare il numero di nuclei fisici usando Webcpu :

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}`);
});
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top