Как стать автором
Обновить

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

Время на прочтение2 мин
Количество просмотров29K

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

Теги:
Хабы:
Всего голосов 39: ↑23 и ↓16+16
Комментарии98

Публикации

Истории

Работа

Ближайшие события

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
24 – 25 октября
One Day Offer для AQA Engineer и Developers
Онлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
26 октября
ProIT Network Fest
Санкт-Петербург
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань