Asm.js становится быстрее


Asm.js — это подмножество стандартного JavaScript, которое достаточно просто для оптимизации движков JavaScript. Теперь Mozilla утверждает, что с некоторыми новыми улучшениями он всего в 1,5 раза медленнее, чем собственный код. Как и почему?

Asm.js — это ограниченное подмножество JavaScript, которое использует стандартные функции JavaScript, чтобы позволить механизму JavaScript вывести тип переменной и, таким образом, выполнить множество оптимизаций, которые невозможны при полной гибкости языка. Это подмножество подходит для обработки как язык низкого уровня, который может быть целью компиляторов других языков. Например, Emscripten компилирует C / C ++ в Asm.js и использовался для создания множества впечатляющих портов хорошо известных приложений C / C ++, чтобы они могли работать в браузере с производительностью, близкой к производительности нативного кода.

Однако закрытие — это не то же самое, что запуск со скоростью нативного кода, и все, что можно сделать для ускорения, приветствуется. Ранее Mozilla продемонстрировала, что Asm.js может запускать типичные программы с машинным кодом в худшем случае примерно в 2 раза медленнее. Теперь, с изменением способа обработки арифметики с плавающей запятой, это было улучшено примерно в 1,5 раза медленнее.

Проблема с JavaScript как языком ассемблера заключается в том, что он не поддерживает диапазон типов данных, необходимых для оптимизации. Это хорошо для программистов, потому что они могут просто использовать числовую переменную и не беспокоиться о разнице между int, int32, float, float32 или float64. JavaScript всегда использует float64, что обеспечивает максимальную точность, но не всегда максимальную эффективность.

Самым большим улучшением, которое Mozilla внесла в свой движок SpiderMonkey, является добавление числового типа float32 в asm.js. Это позволяет преобразовывать арифметику float32 в программе C / C ++ непосредственно в арифметику float32 в asm.js. Это также подтверждается более ранней оптимизацией float32, введенной в Firefox, которая приносит пользу JavaScript в целом.

Вы можете увидеть производительность asm.js на следующей диаграмме — firefox f32 использует 32-битную плавающую точку.

Вы можете видеть, что, хотя firefox f32 все еще почти всегда медленнее, чем собственный код, он приближается к типичному диапазону скорости собственного кода.

Конечно, альтернативный подход к ускорению выполнения кода в браузере разрабатывается и продвигается Google в виде собственных клиентских средств NaCL и Pepper. На данный момент только Google Chrome поддерживает NaCL, но Firefox, Chrome и Opera поддерживают asm.js в большей или меньшей степени. Похоже, что asm.js становится очень важной частью технологического стека.

Процитирую Алона Закая из блога Mozilla:

«- это впечатляющее повышение производительности. И даже текущие показатели производительности — в 1,5 раза медленнее, чем нативная версия, или лучше — не являются пределом того, что может быть достигнуто, поскольку все еще есть большие улучшения, которые ведутся или планируются, как в emscripten и в движках JavaScript «.


Добавить комментарий