2009-12-31 20 views
9

Attualmente sto giocando con l'idea di utilizzare gli IFRAME per implementare un motore di multithreading molto semplice. Tuttavia i miei risultati iniziali mi mostrano che l'esecuzione in thread è più lenta di una semplice esecuzione in un singolo thread.è il multithreading javascript possibile con IFRAME

La mia prova è:

Single Thread

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

più thread

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); 

Così come si può vedere, sto solo suddividendo il carico di lavoro tra i IFRAME (Il codice di cui sopra è solo per dare un quadro migliore di quello che sto facendo, non è un codice funzionante).

Quindi sto pensando che anche usando FRAME FireFox abbia ancora un solo motore JS? Questa supposizione è corretta? (rendendo la mia ricerca stupida), gli altri browser sono diversi?

facendo una rapida Googles ho ottenuto questo articolo: http://codediaries.blogspot.com/2009/12/real-javascript-multithreading-using.html

Tuttavia i miglioramenti delle prestazioni ottenuti qui sono più che probabile che solo facendo le richieste HTTP in parallelo piuttosto che la potenza di elaborazione.

Grazie per i vostri approfondimenti.

Guido

+0

Che ne dici di aggiungere alcuni zeri al contatore di loop?Rendilo rispettivamente 10000, 20000 e 30000 e vedi cosa succede. – chakrit

+0

chakrit: I miei test reali utilizzano 1000 di iterazioni, l'esempio sopra riportato è piccolo solo per semplicità. – gatapia

+0

Una cosa per essere sicuri di prendere in considerazione è la risoluzione del timer JavaScript, che spesso è 15ms: http://ejohn.org/blog/accuracy-of-javascript-time/ – Annie

risposta

0

No, Javascript generalmente non supporta il multi-threading. La maggior parte degli interpreti non ha funzionalità di multi-threading integrate (proprio come PHP), probabilmente per ragioni di portabilità.

Tuttavia, poiché il motore Rhino è interamente scritto in Java, è may be able to tap into the Thread class, ma ciò sarebbe fattibile solo se si sta eseguendo Javascript sul lato server.

+0

Sì, sono a conoscenza degli approcci setTimeout, tuttavia, solo le code funzionano nel thread singolo, quindi no bene. Speravo solo che iframes usasse il proprio interprete (motore). – gatapia

+0

No, non funziona in questo modo. È ancora solo un'istanza del browser. Dovresti aprire una nuova finestra e non sono nemmeno sicuro che funzionerebbe. –

+0

Vale la pena provare. Avvia alcune finestre, rendile più piccole possibile e spostale verso l'angolo. Usa 'opener' per accedere alla collezione sottostante. Sono su un iPhone altrimenti lo farei LOL. Guardando la partita di Husker. –

-1

Si potrebbe provare a completare le operazioni in una chiamata setTimeout.

+1

'window.setTimeout' non crea un nuovo thread. –

3

Consulta lo standard HTML5 Web Workers per vedere come dovrebbe essere il threading JavaScript. Questo è implementato in Firefox 3.5, Safari 4 e Chrome 3, ma non in IE. Se sei disposto a richiedere un plug-in per gli utenti di IE e per i browser più vecchi, consulta Google Gears WorkerPool.

+0

È disponibile oggi, in 3 dei 4 browser più popolari (firefox, safari, chrome) – Breton

+0

Grazie Breton! Ho aggiornato il mio post. – Annie

+0

+1 per avermi presentato al Web Workers! Questo mi farà risparmiare un po 'di tempo :) thx Annie – Mike

0

Ho deciso una soluzione dipendente dal browser. Fondamentalmente userò Workers se disponibile, quindi Gears se disponibile. Finalmente solo single threaded.

Grazie a tutti

Guido

+0

Probabilmente dovresti semplicemente selezionare la risposta di Annie come "accettata" allora (fai clic sul grande segno di spunta a destra della sua risposta, sotto i pulsanti di votazione). Questo dirà alla gente che la sua risposta soddisfa quasi le tue esigenze. –

0

setTimeout chiamata potrebbe essere una buona soluzione in alcune circostanze.

Dipende da ciò che si chiama una discussione. No, questo non distribuirà alcun carico su altri core, ma è multithreading in quanto il thread per il processo viene assegnato a un altro processo nel codice. Dividi i tuoi cicli pesanti in blocchi e lascerai entrare il motore di rendering e altri eventi.

Problemi correlati