Одним из разработчиков проекта Mozilla были представлены результаты эксперимента, проведенного с целью демонстрации производительности современных javascript-движков, которые могут справиться с выполнением ресурсоёмких задач.
В качестве такой задачи разработчики выбрали создание приложения для декодирования видеопотоков H.264, которое целиком написано на javascript.
С целью реализации проекта был взят готовый декодер H.264, созданный на языке Си. Однако он был несколько упрощен, затем преобразован в биткод LLVM и при помощи компилятора Emscripten транслирован в javascript.
Результаты оказались более чем впечатляющими. Только при помощи штатных оптимизаций Emscripten разработчики смогли на самом обычном ноутбуке достичь производительности декодирования видео (480x270) в обозревателе с частотой около тридцати кадров в секунду.
После небольшой оптимизации скорость работы была увеличена приблизительно на 40%. Разработчики полагают, что после применения дополнительных оптимизаций, таких как использование конструкций для параллельной обработки данных и привлечение WebGL для обращения к средствам аппаратного ускорения, можно будет достичь результатов еще более впечатляющих.
Посмотреть демонстрацию декодировщика H.264, развиваемого под кодовым названием Broadway можно здесь. Код проекта опубликован на GitHub.
Чтобы запустить декодировщик, необходимо просто клонировать Git-репозиторий Broadway, а затем открыть файл Demo/broadway.html в последней ночной сборке браузера, в состав которого включен улучшенный анализатор типов, в значительной степени ускоряющий работу JIT-компилятора, встроенного в javascript-движок.
Как правило, полученный после компиляции Emscripten javascript-код отстаёт в 3-4 раза от своего первоначального варианта на языке Си. Однако новая техника оптимизации в JIT-компиляторе Firefox разрешает сократить этот разрыв.
Один из основателей проекта Mozilla, Майк Шевер (Mike Shaver), демонстрируя то как новые техники оптимизации позволяют достичь того, что еще совсем недавно казалось невозможным, привёл Broadway в пример.
В отличие от использования таких методов, как GoogleNative Client или Flash для выполнения требующих интенсивных вычислений блоков кода или рассмотрения предложений по замене javascript на иные языки, например Google Dart, в компании Mozilla просто делают javascript более быстрым.
С этой целью, во-первых, вносятся в javascript-движок новые оптимизации, а во-вторых, добавляются новые возможности языка, например такие, как улучшение средств для прямого обращения к ресурсам GPU, поддержка распараллеливания с привлечением инструкций SIMD, жёстко структурированные типы, бинарные массивы…