Pergunta

Existe uma maneira de determinar o número de núcleos de CPU disponíveis em JavaScript, para que você possa ajustar o número de web workers dependendo disso?

Foi útil?

Solução

sim. Para citar MDN:

.

o navigator.hardwareConcurrency A propriedade somente leitura retorna o Número de processadores lógicos disponíveis para executar encadeamentos no computador do usuário ...

Os computadores modernos têm vários núcleos do processador físico em sua CPU (dois ou quatro núcleos são típicos), mas cada núcleo físico também é geralmente capaz de executar mais de uma linha por vez usando técnicas avançadas de agendamento. Portanto, uma CPU de quatro núcleos pode oferecer oito núcleos de processadores lógicos , por exemplo. O número de núcleos de processador lógico pode ser usado para medir o número de encadeamentos que podem efetivamente ser executados de uma vez sem que eles tenham que a chave de contexto.

O navegador pode, no entanto, optar por relatar um número menor de núcleos lógicos, a fim de representar mais precisão o número de trabalhadores que podem ser executados de uma vez, portanto, não trate isso como uma medida absoluta do número de núcleos em o sistema do usuário.

é suportado por cada navegador, exceto o Internet Explorer. Para isso, você pode usar o polyfill core-estimator ( demonstração , blog post ).

Outras dicas

Não, não há, a menos que você use algum ActiveX.

Aqui está um estimador de simultaneidade bastante rápido que hackeei juntos ...ainda não passou por muitos testes:

http://jsfiddle.net/Ma4YT/2/

Aqui está o código que os trabalhadores executam (já que tenho um link jsfiddle, é necessária uma amostra):


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

O estimador tem um grande número de trabalhadores executados por um curto período de tempo (4ms) e relata os tempos em que foram executados (infelizmente, performance.now() não está disponível em Web Workers para um tempo mais preciso).O thread principal então verifica o número máximo de trabalhadores que estavam em execução durante o mesmo tempo.Este teste é repetido várias vezes para obter uma amostra decente para produzir uma estimativa.

Portanto, a ideia principal é que, dada uma parte de trabalho pequena o suficiente, os trabalhadores só devem ser programados para serem executados ao mesmo tempo se houver núcleos suficientes para suportar esse comportamento.Obviamente, é apenas uma estimativa, mas até agora tem sido razoavelmente precisa para algumas máquinas que testei – o que é bom o suficiente para o meu caso de uso.O número de amostras pode ser aumentado para obter uma aproximação mais precisa;Eu só uso 10 porque é rápido e não quero perder tempo fazendo estimativas em vez de apenas fazer o trabalho.

Se você pretende processar dados de seus funcionários, navigator.hardwareConcurrency pode não ser bom o suficiente, pois retorna o número de núcleos lógicos em navegadores modernos, você pode tentar estimar o número de núcleos físicos 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}`);
});
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top