Новые оптимизации в Firefox сократили разрыв в производительности JavaScript и компилируемых языков
20 декабря 2013 года
Разработчики Mozilla сообщили о реализации в JavaScript-движке SpiderMonkey новой оптимизации операций с плавающей запятой (float32), которая позволила достигнуть нового уровня производительности web-приложений, использующих подмножество Asm.js. Тестирование производительности показало, что выполняемое в новой сборке Firefox JavaScript-приложение выполняется примерно в 1.5 раза медленнее, чем скомпилированная в машинный код реализация того же алгоритма на языке Си. До внесения оптимизации наблюдалось расхождение производительности в два раза.
Ускорение наблюдается и при выполнении обычного JavaScript-кода, особенно использующего специализированные вызовы Math.fround() (Архивная копия от 16 декабря 2013 на Wayback Machine), поддержка которых будет добавлена в 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 расходится почти в два раза).
Источники
править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.