Pull to refresh

«Дело было вечером, делать было нечего» или краткая история о сравнении производительности языков программирования

Reading time2 min
Views28K

"Бенч" дело такое... После нескольких дней бездействия начинается ломка, хочется занять себя чем-нибудь. Иногда я отвлекался на 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).

Tags:
Hubs:
Total votes 39: ↑23 and ↓16+16
Comments98

Articles