2010-07-20 11 views
48

C'è un modo per determinare il numero di core CPU disponibili in JavaScript, in modo da poter regolare il numero di web worker a seconda di quello?Ottieni il numero di core CPU in JavaScript?

+6

@meo: "Questo computer ha huh? CPU core." L'utente medio conosce ancora meno i core rispetto a JS;) – Piskvor

+0

hahaha good point – meo

+2

Perché tutti quelli che scrivono una pagina Web presumono che possano assumere il pieno controllo delle risorse del mio computer? Mi piacerebbe realizzare altre cose mentre leggo il bocconcino di informazioni di cui ho bisogno dalla tua pagina web. –

risposta

56

Sì, navigator.hardwareConcurrency. Supportato in modo nativo in Chrome, Firefox, Edge, Opera e Webkit; supportato in tutti i browser con a polyfill.

+1

Non è definito quando eseguo questo in Chrome 35. – jmort253

+0

È disponibile nell'attuale build di Chrome Canary in base a http://src.chromium.org/ viewvc/blink? view = revision & revision = 175629 Confermato funzionante in Chrome Canary 37. –

+2

Fa parte di uno standard di qualche tipo (come supportato o pensato per essere supportato anche in altri browser)? – jayarjo

20

No, non lo è, a meno che non si utilizzi un po 'di ActiveX.

+0

Breve, e al punto. +1;) – falstro

+0

Ok, questo è quello che mi aspettavo. Grazie ancora! – tsauerwein

+0

Sebbene ci siano discussioni nella mailing list WHATWG sulla fornitura di un attributo simile nella versione 2 delle specifiche: 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 è molto lontano da tali dettagli hardware e non ha alcun meccanismo legittimo per interrogarli.

10

Ecco uno stimatore concorrenza abbastanza veloce ho messo insieme ... non ha ancora subito molte prove:

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

Ecco il codice di eseguire i lavoratori (dal momento che ho un link jsfiddle un campione è necessario):


// 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 funzionare per un breve periodo di tempo (4ms) e di riferire i tempi che correvano loro (purtroppo, performance.now() non è disponibile nei lavoratori web per ulteriori tempismo preciso). Il thread principale quindi controlla per vedere il numero massimo di lavoratori che erano in esecuzione nello stesso tempo. Questo test viene ripetuto un numero di volte per ottenere un campione decente con cui produrre una stima.

Quindi l'idea principale è che, data una piccola quantità di lavoro, i lavoratori dovrebbero essere programmati per essere eseguiti nello stesso momento se ci sono abbastanza core per supportare tale comportamento. Ovviamente è solo una stima, ma finora è stato ragionevolmente accurato 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; Io uso solo 10 perché è veloce e non voglio perdere tempo a stimare rispetto al solo lavoro svolto.

+0

+1 per quel violino – random6174

+0

dovrebbe essere la risposta n. 2, buona velocità e precisione – ViliusL

Problemi correlati