2010-07-20 26 views
48

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

+6

@meo: "Esta computadora tiene núcleos de CPU eh". El usuario promedio sabe incluso menos sobre los núcleos que JS;) – Piskvor

+0

jajaja buen punto – meo

+2

¿Por qué todos los que escriben una página web asumen que pueden tomar el control de todos los recursos de mi computadora? Me gustaría lograr otras cosas mientras leo el tidbit de información que necesito de su página web. –

Respuesta

56

Sí, navigator.hardwareConcurrency. Admitido de forma nativa en Chrome, Firefox, Edge, Opera y Webkit; compatible en todos los navegadores con a polyfill.

+1

No está definido cuando ejecuto esto en Chrome 35. – jmort253

+0

Está disponible en la versión actual de Chrome Canary según http://src.chromium.org/ viewvc/blink? view = revisión & revisión = 175629 Confirmado funcionó en Chrome Canary 37. –

+2

¿Es parte de un estándar de algún tipo (como compatible o destinado a ser compatible con otros navegadores también)? – jayarjo

20

No, no lo hay, a menos que use algún ActiveX.

+0

Corto, y al grano. +1;) – falstro

+0

Ok, eso es lo que esperaba. ¡Aún gracias! – tsauerwein

+0

Aunque hay discusiones en la lista de correo WHATWG sobre proporcionar un atributo similar en la versión 2 de la especificación: http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2009-November/024058.html http: //lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-November/023993.html – tsauerwein

-2

No. JavaScript está muy lejos de tales detalles de hardware y no tiene un mecanismo legítimo para consultarlos.

10

es un estimador de concurrencia bastante rápido Pirateé juntos ... Aquí no ha sometido a muchas pruebas sin embargo:

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

Aquí está el código de los trabajadores corren (ya que tengo un vínculo jsFiddle es necesaria 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 un gran número de trabajadores funcionando durante un breve período de tiempo (4 ms) e informar de los tiempos que se quedaron (por desgracia, performance.now() no está disponible en la web para obtener más trabajadores tiempo exacto). El hilo principal luego verifica 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 generar un estimado.

Así que la idea principal es que, dado un trabajo lo suficientemente pequeño, los trabajadores solo deberían programarse para ejecutarse al mismo tiempo si hay suficientes núcleos para respaldar ese comportamiento. Obviamente es solo una estimación, pero hasta ahora ha sido razonablemente preciso para algunas máquinas que he probado, lo cual es suficiente para mi caso de uso. Se puede aumentar el número de muestras para obtener una aproximación más precisa; Solo uso 10 porque es rápido y no quiero perder el tiempo estimando en lugar de solo hacer el trabajo.

+0

+1 para ese violín – random6174

+0

debería ser respuesta # 2, buena velocidad y precisión – ViliusL

Cuestiones relacionadas