2010-07-20 13 views
48

Czy istnieje sposób określania liczby dostępnych rdzeni procesorów w języku JavaScript, aby można było dostosować liczbę pracowników sieci w zależności od tego?Uzyskaj liczbę rdzeni procesora w języku JavaScript?

+6

@meo: "Ten komputer ma huh? Rdzenie procesora." Przeciętny użytkownik wie nawet mniej o rdzeniach niż JS;) – Piskvor

+0

hahaha dobry punkt – meo

+2

Dlaczego każdy, kto pisze stronę, zakłada, że ​​może przejąć kontrolę nad pełnymi zasobami mojego komputera? Chciałbym osiągnąć inne rzeczy, a ja przeczytałem jedną ciekawostkę potrzebną informacji z twojej strony internetowej. –

Odpowiedz

56

Tak, navigator.hardwareConcurrency. Obsługiwane natywnie w Chrome, Firefox, Edge, Opera i Webkit; obsługiwane we wszystkich przeglądarkach z a polyfill.

+1

Nie jest zdefiniowane, gdy uruchomię to w Chrome 35. – jmort253

+0

Jest dostępne w aktualnej wersji Chrome Canary według http://src.chromium.org/ viewvc/blink? view = revision & reversion = 175629 Confirmed działał w Chrome Canary 37. –

+2

Czy jest to część standardowego rodzaju (np. obsługiwana lub przeznaczona do obsługi również w innych przeglądarkach)? – jayarjo

20

Nie, nie ma, chyba że używasz ActiveX.

+0

Krótkie i na temat. +1;) – falstro

+0

OK, tego się spodziewałem. Wciąż dziękuję! – tsauerwein

+0

Chociaż na liście dyskusyjnej WHATWG znajdują się dyskusje dotyczące zapewnienia podobnego atrybutu w wersji 2 specyfikacji: 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

Nie. JavaScript jest bardzo odległy od takich szczegółów sprzętowych i nie ma żadnego legalnego mechanizmu do ich odpytywania.

10

Oto dość szybkie współbieżności Estymator I hacked razem ... nie przeszedł jeszcze wiele testów:

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

Oto kod robotnicy run (ponieważ mam jsfiddle odnośnik próbka jest konieczne):


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

Estymator jest duża liczba pracowników, prowadzony przez krótki okres czasu (4ms) i zgłoś się czasy, że biegli (niestety performance.now() jest niedostępny w sieci Web Workers dłużej dokładny czas). Główny wątek następnie sprawdza maksymalną liczbę pracowników, którzy pracowali w tym samym czasie. Ten test powtarza się kilka razy, aby uzyskać przyzwoitą próbkę, z której można uzyskać oszacowanie.

Główną ideą jest to, że biorąc pod uwagę wystarczająco małą część pracy, pracownicy powinni być planowani do pracy w tym samym czasie, jeśli istnieje wystarczająca liczba rdzeni do podtrzymania tego zachowania. To oczywiście tylko oszacowanie, ale jak dotąd było to dość trafne dla kilku przetestowanych przeze mnie maszyn - co jest wystarczająco dobre dla mojego przypadku użycia. Liczbę próbek można zwiększyć, aby uzyskać dokładniejsze przybliżenie; Używam tylko 10, ponieważ jest to szybkie i nie chcę marnować czasu na szacowanie, a jedynie na wykonanie pracy.

+0

+1 za to skrzypce – random6174

+0

powinno być # 2 odpowiedzią, dobrą szybkością i dokładnością – ViliusL

Powiązane problemy