Вычисление при помощи JavaScript Web Workers. Вычисляем при помощи Web Workers. Технологии будущего. Оптимизация структуры веб-страниц
Расчет освещения (RayTracing)
Отслеживание движения
Эмуляция огня
Вычисление при помощи JavaScript Web Workers
Недавно закончилось интересное соревнование от Engine Yard (http://www.engineyard.com/blog/2009/programming-contest-win-iphone-3gs-2k-cloud-credit/ ). В качестве задания необходимо было подобрать фразу, которая бы давала наиболее близкий к исходному SHA1-хэш, расстояние между хэшами вычислялась по Хэммингу (число отличающихся битов).
Наибольший интерес представляло 2 участника, которые попытались решить эту задачу при помощи JavaScript. Их программы запускались в браузере и использовали пользовательский компьютер для проведения вычислений. Скорее всего, никто из них так и не добился впечатляющего результата (если брать во внимание тех кластерных монстров, с которыми пришлось соревноваться), но сам подход вызывает неподдельный интерес.
В обоих случаях (если верить исходному коду) используется почти одна и та же тактика: рассчитываются несколько результатов, разделяемых по таймеру. Скорость подбора варьируется от браузера к браузеру на уровне 1000-1500 расчетов в секунду. Естественно, эти алгоритмы весьма ресурсоемки и полностью «убивают» пользовательский процессор и «замораживают» интерфейс браузера.
По-видимому, это является великолепной возможностью применить Web Workers!
Если взять реализацию от Ray C Morgan (http://www.raycmorgan.com/ ), вырезать весь интерфейс и таймеры и разложить вычисления на 4 параллельных потока для Web Workers, то можно добиться скорости в 4500-9500 расчетов в минуту (в новых браузерах, которые поддерживают механизм Web Workers).
По этим ссылкам можно посмотреть на демонстрацию (автором которой является John Resig) и скачать исходные коды:
· Пример Web Worker для взлома SHA1 (http://ejohn.org/apps/web-workers/ )
· Исходный код для «родителя» (http://ejohn.org/apps/web-workers/run.js )
· Исходный код для Worker (http://ejohn.org/apps/web-workers/worker.js )