2009-12-31 17 views
9

Actualmente estoy jugando con la idea de usar IFRAMEs para implementar un motor multihilo muy simple. Sin embargo, mis resultados iniciales me muestran que la ejecución en subprocesos es más lenta que la ejecución en un solo subproceso.es javascript multihilo posible con IFRAMEs

Mi prueba es:

solo hilo

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

Múltiples Hilos

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

Así como se puede ver, sólo estoy dividiendo la carga de trabajo entre los IFRAMEs (El código de la nota de arriba es solo para dar una mejor idea de lo que estoy haciendo, no está funcionando el código).

Así que estoy pensando que incluso con FRAMEs FireFox todavía tiene un solo motor JS? ¿Es correcta esta suposición? (haciendo estúpida mi investigación), ¿Son diferentes los navegadores diferentes?

Haciendo un rápido googles que obtuve este artículo: http://codediaries.blogspot.com/2009/12/real-javascript-multithreading-using.html

No obstante las mejoras de rendimiento obtenidos aquí son más que probable que acaba de hacer peticiones http paralelas en lugar de la potencia de procesamiento.

Gracias por su comprensión.

Guido

+0

¿Qué le parece agregar algunos ceros al contador de bucles?Hazlo 10000, 20000 y 30000 respectivamente y ve lo que sucede. – chakrit

+0

chakrit: Mis pruebas reales están usando miles de iteraciones, el ejemplo anterior es pequeño solo por simplicidad. – gatapia

+0

Una cosa para asegurarse de que también tenga en cuenta es la resolución del temporizador de JavaScript, que a menudo es de 15 ms: http://ejohn.org/blog/accuracy-of-javascript-time/ – Annie

Respuesta

0

No, Javascript en general no es compatible con multi-threading. La mayoría de los intérpretes no tienen ninguna capacidad de multi-threading incorporada (como PHP), probablemente por razones de portabilidad.

Sin embargo, dado que el motor Rhino está escrito completamente en Java, usted may be able to tap into the Thread class, pero esto solo sería factible si está haciendo Javascript en el lado del servidor.

+0

Sí, estoy al tanto de los enfoques de setTimeout, sin embargo, solo las colas funcionan en el único hilo por lo que no bueno. Solo esperaba que iframes usara su propio intérprete (motor). – gatapia

+0

No, no funciona de esa manera. Sigue siendo solo una instancia del navegador. Tendría que abrir una nueva ventana, y ni siquiera estoy seguro de si eso funcionaría. –

+0

Vale la pena intentarlo. Lanza algunas ventanas, hazlas lo más pequeñas posible y muévelas a la esquina. Use 'abridor' para acceder a la colección subyacente. Estoy en un iPhone de lo contrario lo haría ja ja ja. Viendo el juego de Husker. –

-1

Puede intentar ajustar sus operaciones en una llamada a setTimeout.

+1

'window.setTimeout' no crea un nuevo hilo. –

3

Consulte el estándar HTML5 Web Workers para ver cómo debería ser el enhebrado de JavaScript. Esto se implementa en Firefox 3.5, Safari 4 y Chrome 3, pero no en IE. Si está dispuesto a requerir un complemento para usuarios de IE y navegadores anteriores, consulte Google Gears WorkerPool.

+0

Está disponible hoy, en 3 de los 4 navegadores más populares (firefox, safari, cromo) – Breton

+0

Gracias Breton! Actualicé mi publicación. – Annie

+0

+1 por presentarme a los trabajadores de la web! Esto me va a ahorrar algo de tiempo serio :) thx Annie – Mike

0

Me he decidido por una solución dependiente del navegador. Básicamente usaré Workers si está disponible, luego Gears si está disponible. Por último, solo un hilo.

Gracias a todos

Guido

+0

Probablemente debería simplemente seleccionar la respuesta de Annie como "aceptada" luego (haga clic en la marca de verificación grande a la derecha de su respuesta, debajo de los botones de votación). Eso le dirá a la gente que su respuesta cumple con sus necesidades. –

0

setTimeout llamada podría ser una buena solución en algunas circunstancias.

Depende de lo que llame un hilo. No, esto no va a extender ninguna carga a otros núcleos, pero ES de subprocesamiento múltiple, ya que el hilo del proceso se entrega a otro proceso en el código. Divida sus ciclos pesados ​​en fragmentos y le permitirá ver el motor de renderizado y otros eventos.

Cuestiones relacionadas