"Бенч" дело такое... После нескольких дней бездействия начинается ломка, хочется занять себя чем-нибудь. Иногда я отвлекался на pet-проекты, иногда на чтение литературы... Сейчас же я расскажу о том что случилось во время последнего "режима ожидания".

Меня многие годы волновала производительность ЯП (в основном интересовал PHP). Список ниже содержал некоторые мои убеждения, до недавнего времени:

  • PHP один из самых медленных языков программирования

  • Python быстрее PHP

  • Ruby быстрее PHP

  • C/C++ намного быстрее Python и PHP вместе взятых

  • Assembler на порядок быстрее C/C++

Первым делом нужно было определиться какой тест взять за основу. А давайте попробуем написать программу нахождения простых чисел (я в курсе что есть много алгоритмов нахождения простых чисел, неплохая статья на данную тему).

За основу был взят следующий код (примитивный перебор, который даже не прекраща��тся, если уже знает что число не простое):


<?php

$primeNumberCount = isset($argv[1]) ? $argv[1] : 100;

$number = 0;
while ($primeNumberCount > 0) {
    $number++;
    $j = 0;

    for ($i = 1; $i <= $number; $i++) {
        if ($number % $i === 0) {
            $j++;
        }
    }

    if ($j === 2) {
        $primeNumberCount--;
    }
}

echo 'The latest prime number: ' . $number . PHP_EOL;

А дальше все как в тумане: Python, C/C++, Pascal, Go и тд. Все исходники можно глянуть здесь. Все тесты я делал в докере, чтобы не засорять комп.

Потом я наткнулся на книги Андрея Викторовича Столярова, и все завертелось с еще большей силой. Assembler я не трогал со времен универа, но после прочтения книги очень захотелось что-то написать. Могу сразу сказать, что тест для Assembler/NASM я писал больше недели, хотя на любой ЯП из тех что представлены в репозитории уходило не больше часа.

Вот в принципе и результат моей работы:

После того как начали появляться первые результаты, я удивлялся все сильнее и сильнее:

  • оказывается PHP быстрее Python и Ruby

  • PHP вообще один из самых быстрых интерпретируемых языков

  • Python 3 медленнее Python 2

  • разница в работе программы написанной на С/C++ и Assembler/NASM в районе 15%

  • после Rust пришлось добавить тесты с флагом на компиляцию с оптимизацией

  • очень удивил результат теста Node.js/Javascript (разработчики V8 - красавцы)

  • и тд

На данный момент я планирую постепенно добавлять новые тесты (когда позволяет время и настроение).

Цель данной статьи стоит не в том, чтобы показать какой ЯП самый быстрый, а в том что мы можем ошибаться в своих убеждениях, и что не стоит верить всем байкам в курилке (многие из моих заблуждений именно оттуда, кто-то где-то слышал что X быстрее Y).

P.S.: Исходники можно найти здесь

PPS. Добавил Ruby 3, что-то не сильно помогло...

PPPS. Изменил метод подсчета времени выполнения, увеличил порядковый номер простого числа (с 5000 на 7000).

PPPPS. Добавил Haskell.

PPPPPS. Добавил Lua (LuaJIT) и Python 2/3 (PyPy).