» » » Новые оптимизации в Firefox сократили разрыв в производительности JavaScript и компилируемых языков

Новые оптимизации в Firefox сократили разрыв в производительности JavaScript и компилируемых языков

Разработчики Mozilla сообщили о реализации в javascript-движке SpiderMonkey новой оптимизации операций с плавающей запятой (float32), которая позволила достигнуть нового уровня производительности web-приложений, использующих подмножество Asm.js. Тестирование производительности показало, что выполняемое в новой сборке Firefox javascript-приложение выполняется примерно в 1.5 раза медленнее, чем скомпилированная в машинный код реализация того же алгоритма на языке Си. До внесения оптимизации наблюдалось расхождение производительности в два раза.

Новые оптимизации в Firefox сократили разрыв в производительности JavaScript и компилируемых языков

На графике: firefox - выполнение javascript в браузере с float32-оптимизациями, firefox-f32 - при дополнительном использовании Emscripten с оптимизациями float32
Ускорение наблюдается и при выполнении обычного javascript-кода, особенно использующего специализированные вызовы Math.fround(), поддержка которых будет добавлена в Firefox 26. Тем не менее, наибольший эффект достигается при применении нового типа float32 в Asm.js, низкоуровневом подмножестве языка javascript со строгой типизацией, которое полностью совместимо с обычным javascript и может выполняться в любых браузерах. Если браузер не поддерживает Asm.js, то код выполняется как обычный javascript, а если поддерживает - включается дополнительный оптимизирующий модуль, учитывающий добавленные в код аннотации. Наличие информации о типах позволяет использовать не только JIT, но и предварительную AOT-компиляцию, выполняемую для всего кода до начала его выполнения и генерирующую более простой и эффективный машинный код. При этом, в отличие от JIT-компиляции, Asm.js обеспечивает предсказуемую производительность и не зависит от сборщика мусора.

В настоящее время Asm.js используется в web-приложениях, автоматически преобразованных в javascript с языков C/C++ при помощи таких инструментов, как Emscripten и Mandreel. Для более эффективного использования новых оптимизаций в компилятор Emscripten уже добавлена логика, направленная на более активное использование типа float32 вместо менее эффективного типа float64. При этом оптимизации пока не включены по умолчанию в Emscripten, так как ещё не решены некоторые сопутствующие проблемы, такие как увеличение размера итоговой программы и замедление в некоторых специфичных ситуациях.

Примечательно, что по тестам разработчиков javascript-код, непосредственно манипулирующий 32-разрядными вычислениями с плавающей точкой, за счёт предкомпиляции выполняется с использованием движка SpiderMonkey иногда даже быстрее, чем те же вычисления в программе, полученной в результате компиляции в GCC или Clang. Общий уровень производительности Asm.js приближается к значениям, не сильно расходящимся с показателями на которое разные нативные компиляторы отличаются между собой (например, производительность clang и gcc в тестах box2d и copy расходится почти в два раза).

Ключевые теги: javascript, firefox





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

КОММЕНТАРИИ

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Быстрый вход: 

ВОЗМОЖНО ВАС ЭТО ЗАИНТЕРЕСУЕТ

Информация
Комментировать статьи на сайте возможно только в течении 90 дней со дня публикации.