Pregunta

¿Hay alguna manera de determinar el número de núcleos de CPU disponibles en JavaScript, para que pueda ajustar el número de trabajadores web según eso?

¿Fue útil?

Solución

si. Para citar mdn:

the navigator.hardwareConcurrency La propiedad de solo lectura devuelve el Número de procesadores lógicos disponibles para ejecutar hilos en la computadora del usuario ...

Las computadoras modernas tienen múltiples núcleos de procesador físico en su CPU (dos o cuatro núcleos son típicos), pero cada núcleo físico también suele poder ejecutar más de un hilo a la vez utilizando técnicas de programación avanzada. Por lo tanto, una CPU de cuatro núcleos puede ofrecer ocho procesadores lógicos , por ejemplo. El número de núcleos de procesador lógico se puede usar para medir el número de hilos que pueden ejecutarse de manera efectiva a la vez sin que tengan que el interruptor de contexto.

El navegador puede, sin embargo, elegir reportar un número más bajo de núcleos lógicos para representar con mayor precisión el número de trabajadores que pueden ejecutarse de inmediato, así que no trates esto como una medición absoluta del número de núcleos en El sistema del usuario.

Es compatible con Cada navegador excepto Internet Explorer. para eso, puedes usar el PolyFill core-estimator ( demo , blog Publicar ).

Otros consejos

No, no hay, a menos que use algo de ActiveX.

Aquí hay un estimador de concurrencia bastante rápido que hackeé juntos ... aún no ha sufrido muchas pruebas:

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

Aquí está el código que ejecutan los trabajadores (ya que tengo un enlace JSFiddle es necesario una muestra):


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

El estimador tiene una gran cantidad de trabajadores que se ejecutan por un corto período de tiempo (4MS) e informan los tiempos que corrieron (desafortunadamente, el rendimiento. Ahora () no está disponible en los trabajadores web para un momento más preciso). El hilo principal luego comprueba para ver el número máximo de trabajadores que se estaban ejecutando durante el mismo tiempo. Esta prueba se repite varias veces para obtener una muestra decente para producir una estimación con.

Entonces, la idea principal es que, dada una pequeña parte del trabajo, los trabajadores solo deben programarse para correr al mismo tiempo si hay suficientes núcleos para apoyar ese comportamiento. Obviamente, es solo una estimación, pero hasta ahora ha sido razonablemente precisa para algunas máquinas que he probado, lo que es lo suficientemente bueno para mi caso de uso. El número de muestras se puede aumentar para obtener una aproximación más precisa; Solo uso 10 porque es rápido y no quiero perder el tiempo estimando en comparación con solo obtener el trabajo.

Si va a hacer crujir datos a sus trabajadores, GeneracDicetAnDode podría no ser lo suficientemente bueno como devuelve el número de núcleos lógicos en los navegadores modernos, podría intentar estimar el 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top