Самый медленный язык программирования
В электронике скорость и производительность зависят от количества транзисторов, которые может иметь конкретный чип. В соответствии с законом Мура, их число удваивается каждые два года. Вот почему современный мобильный телефон размером с руку намного быстрее суперкомпьютера 90-х годов размером с комнату.
Когда дело касается информатики, разница между более быстрым кодом и более быстрым ПК довольно велика.
Intel и AMD создают мощные вычислительные системы с точки зрения скорости. Задача программистов — писать надежные и быстрые программы.
Одна из вещей, которую следует учитывать при создании программного обеспечения — это языки программирования. Каждый из них реализован по-разному, поэтому имеет свои достоинства. А скорость может просто не входить в их число.
Если необходимо создать программу для сложных задач, таких как игры и тяжелые математические вычисления, лучше не использовать медленные языки программирования.
Получайте свежие новости о мире Web3 в рассылке . Регулярно.
Без рекламы.
Статически типизированные языки обычно компилируются, то есть программа, называемая компилятором, анализирует и преобразует весь англоязычный код в язык ассемблера и создает новый файл. Этот файл, в свою очередь, обрабатывается пользователем вручную.
Языки с динамической типизацией обычно интерпретируются, то есть программное обеспечение — интерпретатор — анализирует и выполняет код построчно.
Большинство склоняется к языкам с динамической типизацией, так как они менее склонны к ошибкам и легко интерпретируются человеком, например, Python. Но за это приходится платить скоростью.
Perl
Perl — это язык сценариев Unix. Он был создан для того, чтобы облегчить программистам процесс написания длинных программ Shell. По сути это просто набор команд Shell, помещенных в файл.
Что еще более важно, Perl упростил задачи, выполнение которых на C и других языках Unix считалось кошмаром.
Как бы то ни было, Perl требовал большей скорости.
Кроме того, в наши дни найти хорошего программиста, работающего на Perl, довольно непросто. Это потому, что, в отличие, например, от Python, Perl очень чувствителен к вводу, и для работы программы нужно, чтобы каждый оператор находился в нужном месте.
Даже в самых эффективных реализациях Perl все еще отстает от своих конкурентов. Тем не менее, язык все еще развивается, а проблемы эффективности решаются одна за другой. В 2019 году состоялся выпуск Perl 6, который получил название Raku.
PHP
PHP — это скриптовый язык программирования, применяемый для веб-разработки, который обычно дополняет HTML, CSS и MySQL при развертывании веб-сайтов.
Многие утверждают, что PHP устарел. Но это не так.
«PHP используется в 79,0% всех веб-сайтов, язык программирования которых нам известен», — заметил автор ресурса w3techs.
Кроме этого, по результатам недавнего опроса StackOverflow, посвященного языкам программирования, сценариям и разметке, выяснилось, что PHP довольно актуален и превосходит как C ++, так и Typescript.
Однако поскольку PHP требует постепенного обучения и дешев в размещении, это отражается на его производительности.
У него низкая скорость из-за того, что это язык с динамической типизацией и у него отсутствует своевременная компиляция (JIT-компилятор). К счастью, 26 ноября 2020 года вышел PHP 8 с функцией оптимизации производительности: встроенным JIT-компилятором.
Он помог PHP приблизиться к языкам программирования своего класса с точки зрения скорости и производительности.
Ruby
Юкихиро Мацумото, официальный автор Ruby, известный в сообществе Ruby как Matz, сказал: «Ruby создан, чтобы радовать программистов».
Ruby — объектно-ориентированный язык программирования. Все интерпретируется как объект. Это сделало его элегантным и простым инструментом.
Однако с точки зрения производительности Ruby — это интерпретируемый язык. Они, как правило, работают медленнее по сравнению с языками, в которых используются компиляторы.
Также Ruby потребляет много памяти и медленно собирает мусор.
Python
Универсальный Python недавно занял 1-е место в рейтинге самых популярных языков программирования. Он широко используется в обработке данных, веб-разработке и кибербезопасности.
Несмотря на впечатляющие преимущества, у Python также есть существенный недостаток — скорость.
Python и Ruby из одного семейства. Они оба медленные из-за GIL и использования интерпретатора. Основное различие между этими двумя языками состоит в том, что первый ориентирован на обработку данных, а второй больше подходит для веб-разработки.
Однако Python поддерживается мощными библиотеками и функциями. И некоторые из них, такие как модуль Numpy и встроенная функция Filter (), реализованы на C ++, что приводит к значительному увеличению производительности. Вот почему в наши дни Python стремительно развивается, опережая другие языки программирования.
Скорость и производительность являются важными факторами, которые следует учитывать при реализации программного обеспечения, однако они зависят не только от выбора языка программирования
Основная причина серьезных проблем со скоростью и производительностью — плохие реализация и дизайн кода.
Несмотря на то, что языки с динамической типизацией работают медленно, они обеспечивают многообещающий опыт программирования, а также повышают производительность.
«Дело было вечером, делать было нечего» или краткая история о сравнении производительности языков программирования
«Бенч» дело такое. После нескольких дней бездействия начинается ломка, хочется занять себя чем-нибудь. Иногда я отвлекался на pet-проекты, иногда на чтение литературы. Сейчас же я расскажу о том что случилось во время последнего «режима ожидания».
Меня многие годы волновала производительность ЯП (в основном интересовал PHP). Список ниже содержал некоторые мои убеждения, до недавнего времени:
- PHP один из самых медленных языков программирования
- Python быстрее PHP
- Ruby быстрее PHP
- C/C++ намного быстрее Python и PHP вместе взятых
- Assembler на порядок быстрее C/C++
Первым делом нужно было определиться какой тест взять за основу. А давайте попробуем написать программу нахождения простых чисел (я в курсе что есть много алгоритмов нахождения простых чисел, неплохая статья на данную тему).
За основу был взят следующий код (примитивный перебор, который даже не прекращается, если уже знает что число не простое):
0) < $number++; $j = 0; for ($i = 1; $i > 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).
PPS. Добавил Ruby 3, что-то не сильно помогло.
PPPS. Изменил метод подсчета времени выполнения, увеличил порядковый номер простого числа (с 5000 на 7000).
PPPPS. Добавил Haskell.
PPPPPS. Добавил Lua (LuaJIT) и Python 2/3 (PyPy).
Самые медленные языки программирования с динамической типизацией
Скорость выполнения программы зависит не только от аппаратной части, но и от языка, на котором она написана. Однако, не все языки программирования могут похвастаться высокой скоростью выполнения кода. Расскажем о некоторых подробнее.
Типизация динамическая и статическая
Условно языки программирования делятся на статически и динамически типизированные. Статически типизированные языки используют компилятор для преобразования кода в программу. Языки с динамической типизацией используют интерпретатор, который выполняет код строка за строкой. Языки с динамической типизацией, такие как Ruby и JavaScript, меньше подвержены ошибкам и легко читаются, но за это часто приходится платить скоростью выполнения.
Perl
Perl – язык общего назначения, изначально разработанный для создания длинных Shell-скриптов. Он используется в системном администрировании, сетевом программировании и разработке графических интерфейсов. Perl создан для облегчения задач, которые невозможны в C и других языках Unix, но скорость его выполнения оставляет желать лучшего. Построчная интерпретация, отсутствие динамического компилятора и медленное развитие языка делают Perl одним из самых медленных в своем классе.
PHP
По данным аналитического портала W3Techs, 79,0% всех веб-сайтов используют PHP. PHP испытывает проблемы со скоростью выполнения из-за динамической типизациии и отсутствия JIT-компилятора. 26 ноября 2020 года релиз восьмой версии PHP вышел с функцией оптимизации производительности и встроенным JIT-компилятором.
Ruby
Ruby – это объектно-ориентированный язык. Ruby позволяет одновременно использовать глобальную блокировку интерпретатора (GIL) для обеспечения потокобезопасности только одному потоку, что еще больше снижает его скорость. 25 декабря 2020 года представлена версия Ruby 3.0.0 с повышенной производительностью компилятора Ruby MJIT. Начиная с Ruby 3.0, JIT улучшает производительность в ограниченных рабочих нагрузках, таких как игры, ИИ или другие приложения, которые тратят большую часть времени на многократный вызов нескольких методов.
Python
В конце января Python занял третье место в рейтинге востребованных языков программирования среди нанимателей, согласно опросу CodinGame. Однако, на данный момент скорость не является его сильной стороной. Python и Ruby во многом похожи. Проблемы со скоростью также вызваны глобальной блокировкой интерпретатора и построчным выполнением кода. При этом многие Python библиотеки и функции реализованы на C++. Это дает некое увеличение в производительности.
Заключение
Вне зависимости от языка, главная причина проблем с производительностью – плохая реализация и дизайн кода. Языки с динамической типизацией работают медленнее, чем компилируемые. В тоже время они значительно удобнее и производительнее во время разработки.