Вышел важный релиз платформы для разработки высоконагруженных и отказоустойчивых систем - Erlang/OTP за номером 24.
Выпуск включает в себя более 1400 коммитов, изменивших около полумиллиона строк. Ключевым нововведением является добавление JIT-компилятора «BeamAsm» в виртуальную машину Erlang'а (BEAM). Попытки реализации данного функционала предпринимались на протяжении ~10 лет и наконец увенчались успехом.
Историю добавления JIT в BEAM можно прочитать в блоге.
Комментарии разработчиков и пользователей о производительности:
Цитата из описания pull-запроса с JIT-функционалом:
Насколько BeamAsm быстрей интерпретатора? Данный показатель в значительной степени зависит от того чем занимается ваше приложение. Например, число estone'ов, в модуле для оценки производительности, возросло на 50%, т.е. теперь, за тоже время выполняется в половину больший объём работы. Разбег в ускорении отдельных тестов варьируется от 170% (сопоставление с образцом) до близкого к нулю (обработка больших сообщений). Большой прирост наблюдается в нагрузке с интенсивными вычислениями, а код с акцентом на обмен сообщениями - практически не ускорился.
Если запустить тесты разборки JSON из комплекта Poison или Jason, наблюдается ускорение от 30 до 130 процентов (в среднем ~70%). В некоторых бенчмарках BeamAsm даже быстрее чем jiffy - json-парсер написанный на Си.
Хосе Валим, создатель языка программирования Elixir, также работающего поверх виртуальной машины BEAM, успел оценить ускорение полученное с добавлением JIT-компиляции:
Одним из многих положительных эффектов JIT оказалось сокращение времени сборки сервера hexpm (включая зависимости) с 111 секунд до 77, что на 31% быстрее. :)
Из подводных камней можно выделить:
- Увеличение потребления памяти на 10% в сравнении с интерпретацией без JIT-компиляции.
- JIT работает только для x86/x86-64 архитектур, но поддержка ARM64 запланирована.
Замечания по сборке Erlang/OTP 24 из исходников:
Для поддержки JIT-компиляции, сборка должна осуществляться компилятором с поддержкой C++17. Проверить работоспособность можно с помощью вызова: erlang:system_info(emu_flavor). В качестве альтернативы может быть исползован официальный докер-образ.
Другие изменения:
- Выполнение EEP 54 (Erlang Enhancement Process), призванного реализовать вывод более человекочитаемых сообщений об ошибках во встроенных функциях. Этот механизм так же может быть использован в библиотеках или приложениях. Пример из твиттера Хосе Валима.
- Интерфейсы графических компонентов, например Observer'а, были переписаны на wxWidgets 3.
Поздравляю сообщество разработчиков на BEAM-языках с значительным релизом, призываю обновить Erlang/OTP, для получения бесплатного прироста производительности!
>>> Подробности