В прошлом году мы сделали строковый ассоциативный бенчмарк и меньший строковый ассоциативный бенчмарк (измеряющая операция объединения строк и встроенный ассоциативный набор и получение массива), числовую гребенчатую сортировку бенчмарк и строковую гребенчатую сортировку бенчмарк (измерение произвольного доступа к базовому массиву, преобразование строк и замена массива для чисел и строк), в этом году используется более новый сервер: 32-ядерный, работающий на 64-битной Ubuntu 21.10. На этот раз мы пропустим языки программирования, которые не являются deb-пакетами (если только скрипт установки не состоит из одной строки и не разрушает системные каталоги) или без прямой команды компиляции-запуска, как предыдущая, а также только лучший из 3-х запусков.

$ alias time=’/usr/bin/time -f «\nCPU: %Us\tReal: %es\tRAM: %MKB»

На этот раз NodeJS не удалось завершить (после ожидания в течение часа) с 10-кратным увеличением данных по сравнению с прошлым годом для вспомогательного теста. Вот таблица и окончательный результат (реальная продолжительность и оперативная память):

Часто задаваемые вопросы

1. Почему вы также измеряете продолжительность компиляции? потому что опыт разработчика также важен (цикл обратной связи, редактирование-перестроение/компиляция-запуск), по крайней мере для меня, было бы ужасно, если бы нам пришлось ждать минуту, чтобы скомпилировать, прежде чем мы сможем что-то протестировать. Мы всегда могли бы написать предварительно вычисленные значения с шаблоном C++, например, чтобы ускорить время выполнения, но задержка компиляции была бы очень отстойной.

2. Почему бы сначала не прогреть виртуальную машину? каждая реализация имеет свои преимущества и недостатки. Мы уже знаем, что скомпилированный язык в основном быстрее во время выполнения, но за счет относительно более медленного цикла обратной связи при разработке. Интерпретируемый язык в основном медленнее во время выполнения, особенно если он выполняется с использованием виртуальной машины, которая имеет дополнительные затраты на запуск, за исключением одной с оптимизацией AOT или JIT. Таким образом, чтобы сделать его справедливым для каждого типа реализации, мы делаем это по-разному, не прославляя производительность во время выполнения (что очень важно для сервера или долгоживущего процесса, но не лучше всего для разработки или затрат на CI, которыми люди часто пренебрегают), а общая производительность, которая состоит из продолжительности компиляции (если есть) + продолжительности запуска виртуальной машины (если есть) + продолжительности AOT или JIT (если есть) + продолжительности выполнения, поэтому каждая стратегия, используемая разработчиком PL, может быть справедливо оценена.

3. Почему нет C++, VB.NET, C#, D, Object-Pascal? не хочу что-то компилировать (поскольку в одном флаге нет команды сборки и запуска).

4. Почему нет Kotlin, Scala, Rust, Elixir, Pony, Swift, Groovy или Zig? Лень добавлять :3 вы можете внести свой вклад (создайте пулл-реквест, потом я запущу бенчмарк еще раз, так как есть прекомпилированный репозиторий бинарников/deb/apt/ppa для компилятора/интерпретатора).

5. Почему нет Ruby 3.1? Я не могу найти PPA для последней версии Ruby, последний репозиторий Ubuntu 21.10 — Ruby2.7.

Соавторы: ilmanzo (Ним, Кристал, D), inkydragon (Джулия)

Первоначально опубликовано на http://kokizzu.blogspot.com.