- Самый долгий язык программирования
- Perl
- PHP
- Ruby
- Python
- Python избавился от недостатка, над которым смеялись все программисты. Его научили работать со скоростью С и С++
- Python ускорился
- Все бесплатно, но не совсем
- Плюсов без минусов не бывает
- Почему именно C++
- «Дело было вечером, делать было нечего» или краткая история о сравнении производительности языков программирования
Самый долгий язык программирования
В электронике скорость и производительность зависят от количества транзисторов, которые может иметь конкретный чип. В соответствии с законом Мура, их число удваивается каждые два года. Вот почему современный мобильный телефон размером с руку намного быстрее суперкомпьютера 90-х годов размером с комнату.
Когда дело касается информатики, разница между более быстрым кодом и более быстрым ПК довольно велика.
Intel и AMD создают мощные вычислительные системы с точки зрения скорости. Задача программистов — писать надежные и быстрые программы.
Одна из вещей, которую следует учитывать при создании программного обеспечения — это языки программирования. Каждый из них реализован по-разному, поэтому имеет свои достоинства. А скорость может просто не входить в их число.
Если необходимо создать программу для сложных задач, таких как игры и тяжелые математические вычисления, лучше не использовать медленные языки программирования.
Статически типизированные языки обычно компилируются, то есть программа, называемая компилятором, анализирует и преобразует весь англоязычный код в язык ассемблера и создает новый файл. Этот файл, в свою очередь, обрабатывается пользователем вручную.
Языки с динамической типизацией обычно интерпретируются, то есть программное обеспечение — интерпретатор — анализирует и выполняет код построчно.
Большинство склоняется к языкам с динамической типизацией, так как они менее склонны к ошибкам и легко интерпретируются человеком, например, 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 стремительно развивается, опережая другие языки программирования.
Скорость и производительность являются важными факторами, которые следует учитывать при реализации программного обеспечения, однако они зависят не только от выбора языка программирования
Основная причина серьезных проблем со скоростью и производительностью — плохие реализация и дизайн кода.
Несмотря на то, что языки с динамической типизацией работают медленно, они обеспечивают многообещающий опыт программирования, а также повышают производительность.
Python избавился от недостатка, над которым смеялись все программисты. Его научили работать со скоростью С и С++
Python получил сверхбыстрый компилятор. Производительность скомпилированных им программ оказалась в 10-100 раз быстрее в сравнении с приложениями на выходе традиционного интерпретатора CPython. Теперь по этому параметру Python ничуть не уступает, а в некоторых случаях даже превосходит С и C++, своих главных конкурентов среди языков программирования.
Python ускорился
Язык программирования Python, самый популярный и очень востребованный в мире, в одночасье стал в несколько раз лучше благодаря стараниям экспертов стартапа Exaloop и Массачусетского технологического института (MIT). Они создали компилятор Codon, существенно повышающий производительность скомпилированных приложений на фоне их аналогов, вышедших из-под стандартных интерпретаторов. По скорости работы они едва ли не быстрее программ на С и C++, пишет The Register.
Низкая производительность программ – то, за что Python, при всей простоте его освоения, ругают чаще всего. И нередко в этом плане его сравнивают именно с С и C++, притом не в его пользу. Codon устраняет это неравенство – по словам разработчиков, он способен генерировать на выходе чистый машинный код без привязки к среде выполнения Python Runtime.
Разработчики уверяют, что в сравнении с обычными интерпретаторами для Python новый Codon обеспечивает ПО в 10-100 раз более высокую производительность. В данном случае идет сравнение с интерпретатором CPython при в однопоточном режиме работы. «Производительность Codon обычно соответствует (а иногда и лучше) производительности компиляторов C/C++», – утверждают они.
Все бесплатно, но не совсем
Проект Codon распространяется по лицензии Business Source License (BSL), то есть по умолчанию все его компоненты доступны бесплатно при соблюдении ряда условий эксплуатации. Все без исключения файлы, необходимые для работы Codon, размещены в профиле стартапа Exaloop на GitHub (принадлежит Microsoft). В комплект входят компилятор, среда выполнения (runtime) для исполняемых файлов и отдельная библиотека функций на замену штатным библиотечным вызовам на Python.
Что немаловажно, исходные тексты самого компилятора, библиотеки и runtime написаны вовсе не на Python, как многие, вероятно, ожидали. Авторы использовали C++.
Ограничения, накладываемые лицензией BSL на бесплатное использование распространяемого под ней ПО, всегда имеют срок действия. В случае с Codon они продлялся до 1 ноября 2025 г., после чего весь проект будет переведен на лицензию Apache 2.0. А пока Codon распространяется под BSL, его код можно копировать и модифицировать, если в дальнейшем он не будет использоваться в коммерческих целях.
Плюсов без минусов не бывает
Codon разрабатывается как фреймворк для создания высокопроизводительных предметно-ориентированных языков (DSL) в Python. DSL — это языки, ориентированные на конкретную цель, в отличие от языка программирования общего назначения, которым относятся, например, Python или C. Примеры DSL – это CSS и SQL.
У истоков проекта стоят создатели Python-подобного языка программирования Seq, который и лежит в его основе. Авторы Codon позиционируют его как наследника Seq.
К недостаткам Codon эксперты The Register относят в первую очередь выбор разработчиками лицензии BSL с ее ограничениями, и необходимость ждать два с половиной года до перехода на Apache 2.0. Также они упомянули отсутствие поддержки некоторых модулей Python. Например, компилятор пока не поддерживает функции динамической обработки типов, плюс для целых чисел в нем используется только 64-битный тип int. В CPython таких ограничений нет.
Плюсы Codon – это очень высокая производительность при однопоточном выполнении. Компилятор также снабжен возможностью работы в многопоточном режиме.
Почему именно C++
Python – это самый популярный язык программирования в мире, согласно рейтингу Tiobe. На первое место в нем он вырвался лишь в октябре 2021 г., хотя существует Python c середины 1980-х годов. Его популярность стремительно растет лишь в последние несколько лет, тогда как другие представители топ-3 Tiobe находятся на вершине этого рейтинга годами.
Основной конкурент Python – это С, с компилятором для которого авторы Codon сравнили свое детище в первую очередь. До октября 2021 г. именно он был первым в рейтинге Tiobe. В декабре 2022 г. в тройку лидеров, сместив Java, вошел C++ – еще один конкурент Python. Скорость компиляции всегда была их неоспоримым преимуществом перед Python, которого, благодаря Codon, больше нет.
«Дело было вечером, делать было нечего» или краткая история о сравнении производительности языков программирования
«Бенч» дело такое. После нескольких дней бездействия начинается ломка, хочется занять себя чем-нибудь. Иногда я отвлекался на 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).