2009-12-31 2 views
9

В настоящее время я играю с идеей использования IFRAME для реализации очень простого многопоточного движка. Однако мои первоначальные результаты показывают, что работа в потоках медленнее, чем просто работа в одном потоке.javascript многопоточность возможна с IFRAMEs

Мой тест:

Single Thread

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

Множественные нити

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

Итак, как можно видеть, я просто разделив нагрузку среди ссылок IFRAME (Указанный выше код предназначен только для того, чтобы лучше понять, что я делаю, это не работает код).

Итак, я думаю, что даже с использованием FRAME FireFox все еще есть только один JS-движок? Правильно ли это предположение? (что делает мои исследования глупыми), отличаются ли другие браузеры?

делая быстрый Googles я получил эту статью: http://codediaries.blogspot.com/2009/12/real-javascript-multithreading-using.html

Однако повышение производительности, достигнутые здесь, скорее всего, просто делают параллельные запросы HTTP, а не вычислительной мощности.

Спасибо за понимание.

Guido

+0

Как насчет добавления нулей в счетчик циклов?Сделайте 10000, 20000 и 30000 соответственно и посмотрите, что произойдет. – chakrit

+0

chakrit: Мои настоящие тесты используют 1000 итераций, приведенный выше пример небольшой для простоты. – gatapia

+0

Одна вещь, чтобы убедиться, что вы также учитываете разрешение JavaScript таймера, которое часто составляет 15 мс: http://ejohn.org/blog/accuracy-of-javascript-time/ – Annie

ответ

0

Нет, Javascript вообще не поддерживает многопоточность. Большинство интерпретаторов не имеют встроенных многопоточных возможностей (как и PHP), возможно, по причинам мобильности.

Однако, поскольку двигатель Rhino написан полностью на Java, вы may be able to tap into the Thread class, но это было бы возможно только в том случае, если вы используете серверный Javascript.

+0

Да, я знаю о подходах setTimeout, однако, что только очереди работают в одном потоке, поэтому нет хорошо. Я просто надеялся, что iframes будет использовать собственный интерпретатор (движок). – gatapia

+0

Нет, это не работает. Это еще один экземпляр браузера. Вам нужно будет запустить новое окно, и я даже не уверен, что это сработает. –

+0

Стоит попробовать. Запустите несколько окон, сделайте их как можно более маленькими и переместите их в угол. Используйте 'opener' для доступа к основной коллекции. Im на iPhone, иначе я бы сделал это LOL. Наблюдение за игрой Хаскер. –

-1

Вы можете попробовать обернуть свои операции в вызове setTimeout.

+1

'window.setTimeout' не создает новый поток. –

3

Ознакомьтесь со стандартом HTML5 Web Workers, чтобы увидеть, как выглядит нарезка JavaScript. Это реализовано в Firefox 3.5, Safari 4 и Chrome 3, но не в IE. Если вы хотите установить плагин для пользователей IE и старых браузеров, проверьте Google Gears WorkerPool.

+0

Он доступен сегодня, в 3 из 4 самых популярных браузеров (firefox, safari, chrome) – Breton

+0

Спасибо, Бретон! Я обновил свой пост. – Annie

+0

+1 для представления меня веб-работникам! Это спасет меня какое-то серьезное время :) thx Annie – Mike

0

Я решил решение, зависящее от браузера. В основном я буду использовать Workers, если это возможно, то Gears, если доступно. Наконец, просто однопоточное.

Спасибо всем

Guido

+0

Вы должны, вероятно, просто выбрать ответ Анни как «принятый» (затем нажмите на большой флажок справа от ее ответа под кнопками голосования). Это скажет людям, что ее ответ в значительной степени соответствует вашим потребностям. –

0

SetTimeout вызов может быть хорошим решением в некоторых обстоятельствах.

Это зависит от того, что вы называете нитью. Нет, это не будет распространять нагрузку на другие ядра, но это многопоточность, поскольку поток процесса отдается другому процессу в коде. Разделите свои тяжелые циклы на куски, и вы позволите посмотреть движок рендеринга и другие события.

Смежные вопросы