2009-12-31 19 views
9

Obecnie gram z pomysłem użycia IFRAME do wdrożenia bardzo prostego silnika wielowątkowego. Jednak moje wstępne wyniki pokazują, że uruchamianie w wątkach jest wolniejsze niż uruchamianie w jednym wątku.jest wielowątkowość javascript możliwe z IFRAME

Mój test jest:

pojedynczy wątek

var start = new Date().getTime(); 
for (var i = 0; i < 300; i++) { /* Do costly processor operations */ } 
debug('Took: ' + new Date().getTime() - start); 

wielu wątków

var start = new Date().getTime(); 
// In thread 1 
for (var i = 0; i < 100; i++) { /* Do costly processor operations */ } 
// In thread 2 
for (var i = 100; i < 200; i++) { /* Do costly processor operations */ } 
// In thread 3 
for (var i = 200; i < 300; i++) { /* Do costly processor operations */ } 
// In a callback in the original FRAME (thread) 
debug('Took: ' + new Date().getTime() - start); 

Więc jak widać, jestem po prostu dzielenie obciążenia pracą wśród IFRAMES (Powyższy kod jest tylko po to, aby dać lepszy obraz tego, co robię, to nie działa kod).

Więc myślę, że nawet używanie FRAMEs FireFox nadal ma tylko jeden silnik JS? Czy to założenie jest poprawne? (czyniąc moje badania głupimi), Czy inne przeglądarki są inne?

robi szybki gogli Mam ten artykuł: http://codediaries.blogspot.com/2009/12/real-javascript-multithreading-using.html

Jednak poprawa wydajności osiągane tutaj są bardziej niż prawdopodobne, po prostu robi równoległych żądań http zamiast mocy obliczeniowej.

Dzięki za spostrzeżenia.

Guido

+0

Co powiesz na dodanie zer do licznika pętli?Ustaw odpowiednio 10000, 20000 i 30000 i zobacz, co się stanie. – chakrit

+0

chakrit: Moje prawdziwe testy używają 1000 iteracji, powyższy przykład jest mały tylko dla uproszczenia. – gatapia

+0

Jedną z rzeczy, które należy wziąć pod uwagę, jest rozdzielczość timera JavaScript, która często wynosi 15 ms: http://ejohn.org/blog/accuracy-of-javascript-time/ – Annie

Odpowiedz

0

Nie Javascript generalnie nie obsługuje wielowątkowości. Większość interpreterów nie ma wbudowanych możliwości wielowątkowości (podobnie jak PHP), prawdopodobnie ze względu na przenośność.

Jednak, ponieważ silnik Rhino jest napisany w całości w Javie, ty masz may be able to tap into the Thread class, ale byłoby to możliwe tylko, jeśli robisz JavaScript po stronie serwera.

+0

Tak, jestem świadomy podejścia setTimeout, jednak tylko kolejki działają w jednym wątku, więc nie dobry. Miałem tylko nadzieję, że iframes wykorzystają swój własny interpreter (silnik). – gatapia

+0

Nie, to nie działa w ten sposób. To wciąż tylko jedna instancja przeglądarki. Musiałbyś uruchomić nowe okno i nie jestem nawet pewien, czy to też zadziała. –

+0

Warto spróbować. Uruchom kilka okien, zminimalizuj je i przenieś do rogu. Użyj 'opener', aby uzyskać dostęp do podstawowej kolekcji. Jestem na iPhone'ie, inaczej zrobiłbym to LOL. Oglądanie gry Husker. –

-1

Można spróbować zawijać operacje w wywołaniu setTimeout.

+1

'window.setTimeout' nie tworzy nowego wątku. –

3

Sprawdź standard HTML5 Web Workers, aby zobaczyć, jak powinien wyglądać wątek JavaScript. Jest to zaimplementowane w Firefox 3.5, Safari 4 i Chrome 3, ale nie w IE. Jeśli chcesz zainstalować wtyczkę dla użytkowników IE i starszych przeglądarek, sprawdź numer Google Gears WorkerPool.

+0

Jest już dostępna w 3 z 4 najpopularniejszych przeglądarek (firefox, safari, chrome). – Breton

+0

Dzięki Breton! Zaktualizowałem swój post. – Annie

+0

+1 za wprowadzenie mnie do Workers! Pozwoli mi to zaoszczędzić trochę czasu :) Annie – Mike

0

Zdecydowałem się na rozwiązanie zależne od przeglądarki. Zasadniczo będę używał Workers, jeśli to możliwe, a następnie Gears, jeśli jest dostępny. Wreszcie tylko jeden gwintowany.

Dzięki wszystkim

Guido

+0

Powinieneś chyba wybrać odpowiedź Annie jako "zaakceptowaną" (kliknij duży znacznik wyboru po prawej stronie jej odpowiedzi, pod przyciskami do głosowania). To powie ludziom, że jej odpowiedź w dużym stopniu spełnia twoje potrzeby. –

0

setTimeout wezwanie może być dobrym rozwiązaniem w niektórych okolicznościach.

Zależy od tego, co nazywasz wątkiem. Nie, to nie rozniesie obciążenia dla innych rdzeni, ale JEST wielowątkowość w tym, że wątek procesu zostaje poddany innemu procesowi w kodzie. Podziel swoje ciężkie cykle na porcje i pozwól, aby silnik renderowania i inne zdarzenia odnalazły się.