Скорость языков программирования: Сравнение скорости работы языков программирования на примере решения задачи обучения нейронной сети / Хабр

Сравнение скорости работы языков программирования на примере решения задачи обучения нейронной сети / Хабр

Цель работы

Сравнить скорости работы программ написанных на различных языках и запускаемых на различных операционных системах. Результаты работы прежде всего интересны для решения задач связанных с нейросетями.

Железо и ОС

Для тестирования по Ubuntu и Windows ( ноутбук DELL Inspiron-7577):

RAM: 16Gb

CPU: Intel Core i7-7700HQ @ 8x 3.8GHz

рис. 1 (вывод команды screenfetch на ноутбуке DELL Inspiron-7577 под ОС Ubuntu)

Для тестирования на под MAC:

RAM: 8Gb

CPU: Intel Core i7 2.7GHz

Так-же мы провели тесты на Raspberry pi 4: 

RAM: 4Gb

CPU: ARMv7 rev 3 (v7l) @ 4x  1,5Ghz

рис. 2 (вывод команды screenfetch на raspberry pi 4)

Программа для тестирования

Для проведения тестов была написана программа имитирующая сеть из 5 нейронов, целью программы является научится правильно решать задачу нахождения исключающего или с точностью delta = 0. 01. Все параметры и свойства нейросети, а также алгоритм работы и обучения были взяты из этих 2 постов:

https://habr.com/ru/post/312450/

https://habr.com/ru/post/313216/

Единственные изменения были внесены в коэффиценты E (эпсилон) — скорость обучения, α (альфа) — момент (E = 0.3, α = 0.5). При использовании значений указанных в статье нейросеть в течении длительного времени (8 ч.) не могла найти решения.

По своей структуре программа представляет из себя некую ООП модель, в  которой класс NeuronNet оперирует массивами объектов класса Neuron и Sinaps. Объект класса Sinaps содержит в себе ссылки на 2 объекта класса Neuron. Для расчетов с плавающей точкой применяется тип данных double.

Алгоритм тестирования: 

  1. Создается объект класса NeuronNet
  2. Проходит тестовый обучающий сет. Результаты работы нейросети до обучения и после выводятся в консоль и используются для сравнения с эталонными.
  3. Программа входит в бесконечный цикл где раз в  100000 итераций происходит сравнение результатов работы нейросети с эталонными результатами. В случае если погрешность составляет менее delta = 0.01 бесконечный цикл завершается. Каждое такое сравнение в дальнейшем буду называть эпохой. При прохождении эпохи в консоль выводится время которое она заняла и результаты расчета нейросети для каждого значения таблицы исключающего или.
  4. После выхода из цикла программа распечатывает время прошедшее с 0 до последней эпохи и завершается.

Программа изначально была написана на языке python3 (https://gitlab.com/di.romanov/neuron1.git), и впоследствии переведена на Java, Kotlin, C++(gcc), php7, ruby

рис. 3 (пример вывода программы написанной на языке Kotlin, запущенной под ОС Ubuntu)

Результаты тестирования

При работе программы написанные на Kotlin, Java, php, ruby и Python давали одинаковые ответы после обучающего сета, вывод после обучающего сета программы написанной  на С++ был другим, что повлекло за собой изменение количества эпох которое ей потребовалось для должного обучения. По этой причине будут приведены как сравнения времени работы всей программы так и времени которое потребовалось для прохождения одной эпохи.

Время обучения [мc.]
Ubuntu Windows Raspbian MAC
Python 104569 204239 521112 335621
Kotlin 4968 4877 19963 7775
Java 4892 5994 17973 7652
Ruby 79684 90524 457229
C++ 100990 212000 505377
php 75591 131170 513996

таб.

1(время прохождения всех эпох до обучения нейросети) 

Время прохождения одной эпохи [мc.]
Ubuntu Windows Raspbian MAC
Python 8713 16942 43315 27576
Kotlin 392 405 1631 625
Java 395 485 1434 635
Ruby 6667 7566 38040
C++ 4185 8834 21057
php 6381 10012 43168

таб. 2(время прохождения одной эпохи) 

Анализ результатов


граф. 1 (время прохождения всех эпох  для программ запущенных на ОС Ubuntu)

Как и ожидалось Kotlin и Java показали одинаковую скорость работы обогнав Python примерно в 20 раз. Рассмотрим некоторые не столь очевидные наблюдения.

Неожиданно медленными оказались результаты работы программы написанной на C++. Отчасти  это можно объяснить большим количеством эпох которое ей потребовалось для нахождения правильного ответа. Однако даже с учетом этого  (см граф. 2) она отстает по быстродействию от Java программ. 

граф. 2 (время прохождения одной эпохи  для программ запущенных на ОС Ubuntu)

Еще одной причиной подобных результатов может быть различное использование ресурсов процессора (см рис. 4, рис. 5)

рис. 4 (вывод монитора порта Ubuntu во время выполнения программы написанной на Kotlin)


рис. 5 (вывод монитора порта Ubuntu во время выполнения программы написанной на C++)

Как можно видеть, Java единовременно использует минимум 4 ядра, в то время как программа на C++ — одно. Однако, этим нельзя объяснить превосходство в скорости в 8 раз, так как Java не задействует все ядра на 100%.

Существенные различия в скорости работы программы написанной на Python в зависимости от ОС.  При запуске программ на Java на разных ОС различия в скорости работы составили не более 40% (даже на разных машинах, за исключением raspberry), однако при запуске програмы на Python были получены следующий значения: Ubuntu — 104c, Windows — 204c, MAC — 335c.  Отношение скорости работы программы на Kotlin к скорости работы программе на Python составляет 21 для ОС Ubuntu, 26 для Raspberry и аж 43 для Mac.

Все интерпретируемые языки программирования показали одинаковую скорость работы на Raspbery

Авторы перевода с Python3

Ruby, php

https://vk.com/silverlumen

Java

https://vk.com/id365699827

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

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

Топ-10 самых быстрых языков программирования

В мире существует около 700 языков программирования. Проще говоря, язык программирования используется для того, чтобы дать компьютеру инструкции для выполнения требуемой задачи. Вы когда-нибудь задумывались, какой из всех языков программирования является самым быстрым с точки зрения скорости выполнения? В большинстве случаев скорость — не единственная метрика для выбора лучшего языка. Каждый язык имеет свою специализацию, и каждый язык предназначен для определенных функций.

Несмотря на то, что некоторые языки программирования медленные, они просты в использовании и значительно сокращают затраты на разработку и рабочую силу, а также сокращают время. Скорость языка программирования зависит от различных факторов, таких как:

  • Компилятор
  • Кроссплатформенность
  • Безопасность
  • Статическая и динамическая типизация

Компилятор: Быстрее, чем интерпретируемые языки . Компилятор компилирует весь код в исполняемый машинный код одновременно, тогда как интерпретатор просматривает программу построчно и преобразует ее в машинный код. Таким образом, это задерживает время выполнения для интерпретаторов. Компилятор при компиляции преобразует язык высокого уровня в промежуточный код, который экономит большую часть времени при выполнении. Компьютер выполняет промежуточный код намного быстрее, чем интерпретаторы.

Кросс-платформенный: В некоторых объектно-ориентированных языках, таких как Java и C#, исходный код будет подвергаться как компиляции, так и интерпретации. Из-за кросс-платформенного использования и преобразования в байт-код скорость здесь будет скомпрометирована, что делает кросс-платформенные языки медленнее, чем другие языки.

Безопасность: Некоторые языки, такие как C, имеют множество уязвимостей. Опять же, это сводится к работе компилятора по проверке этих уязвимостей. Исследования показывают, что некоторые популярные языки до сих пор подвержены множеству серьезных ошибок. Например, C страдает от ошибок буфера, PHP уязвим для межсайтового скриптинга, а Python — для проверки ввода. Для устранения этих ошибок некоторые компиляторы имеют дополнительные функции безопасности. Таким образом, исходный код проходит через различные уровни проверки безопасности, что делает процесс компиляции немного медленным. Таким образом, самый быстрый язык в этом списке не является лучшим с точки зрения безопасности, но лучше других по времени выполнения.

Статическая и динамическая типизация: Статическая типизация означает, что тип переменной известен во время компиляции. Он проверяет правильность назначения переменных. Если переменная инициализируется несколько раз с разными типами данных, ошибки отображаются во время компиляции. Динамическая типизация означает проверку типа переменной во время выполнения. Он уведомляет об ошибке во время выполнения. В статически типизированных языках проверка типов происходит перед выполнением во время компиляции. В то время как в динамически типизированных языках проверка типов происходит во время выполнения вместе с выполнением. Таким образом, это делает языки со статической типизацией быстрее, чем языки с динамической типизацией.

Могут быть случаи, когда один язык может быть быстрее другого, но в большинстве случаев допустим следующий список.

10. Pascal

Pascal — процедурный язык программирования высокого уровня. Он работает на Windows, macOS и UNIX/Linux. Несмотря на то, что Паскаль находится на 10-м месте среди этих языков, он быстрее по сравнению с другими языками программирования, которых нет в этом списке. Поскольку Pascal является статически типизированным языком, он работает быстрее, но не быстрее, чем другие языки в этом списке.

9. F#

F# — это кроссплатформенный язык программирования с открытым исходным кодом. F# — это язык .NET , который можно использовать для создания веб-приложений, мобильных приложений, обработки данных и облачных вычислений. По скорости он почти аналогичен C#, но асинхронный код выполняется быстрее в C#, чем в F#. Компилятор является родным для C#, и можно сгенерировать оптимизированный код. Но в F# компиляторы не нативные. Вот почему F# уступает C#.

8. C#

C# — мультипарадигмальный язык программирования общего назначения. C# можно использовать для создания веб-приложений, мобильных приложений, приложений дополненной/виртуальной реальности (AR/VR) и веб-сервисов. C# имеет сборщик мусора, который представляет собой эффективную технику управления памятью, но с точки зрения выполнения программы он занимает больше времени по сравнению с C++. C# и Java имеют более или менее одинаковую скорость, но среда выполнения Java в некоторых случаях сравнительно быстрее, чем C#. Хотя C# обладает многими хорошими возможностями и функциями, его скорость немного ниже по сравнению с несколькими языками.

7. Java

Java — один из широко используемых языков, к тому же очень быстрый. Несмотря на использование виртуальной машины Java, она все же быстрее своих аналогов, таких как C#. Он не такой быстрый, как C или C++, потому что не зависит от платформы. В java исходный код сначала преобразуется компилятором в байт-код, затем java вызывает интерпретатор Java, известный как виртуальная машина Java. Затем загрузчик классов загружает байт-код в ОС. Затем верификатор байт-кода java проверяет байт-код на наличие проблем с безопасностью. Затем, наконец, исполнительный механизм преобразует байтовый код в машинный код. Так как такие языки, как C# и java, должны пройти очень много шагов при компиляции, они сравнительно медленнее, чем другие языки в этом списке.

Изучите один из самых важных языков программирования, Java, с Geeksforgeeks Фонд программирования на Java — курс для самостоятельного изучения , который был специально разработан для начинающих, чтобы они могли получить знания обо всем с нуля. Зарегистрируйтесь сейчас и получите уроки от нашего лучшего наставника Сандипа Джейна.

6. Ада

Ада — это статический объектно-ориентированный язык высокого уровня. Он поддерживает параллельное программирование и более надежен. Несмотря на то, что это очень быстро, это не ставит под угрозу аспект безопасности. Компиляторы Ады могут более эффективно находить ошибки. Некоторые программисты говорят, что программы, написанные на Аде, содержат меньше ошибок и выполняются быстрее. Чтобы добиться надежности, он жертвует скоростью, поэтому не смог попасть в верхнюю часть списка.

5. Julia

Julia — это высокоуровневый высокопроизводительный язык динамического программирования. Julia можно использовать для создания приложений и микросервисов. Юлия поддерживает несколько платформ. Другие программы могут интегрировать Юлию. Это быстро из-за его дизайнерских решений и JIT-компилятора. Причина, по которой он не возглавляет список, заключается в том, что это динамический язык.

4. Фортран

Фортран — язык общего назначения, используемый для научных расчетов. Он известен своей высокой производительностью и используется в рейтинге самых быстрых суперкомпьютеров. Fortran широко используется для численного программирования, так как он быстрее. Поскольку Fortran тратит много времени на чтение и запись данных, он работает медленнее, чем три языка ниже в этом списке.

3. Rust

Rust — это высокоуровневый мультипарадигмальный язык, разработанный для повышения производительности и безопасности. Rust работает очень быстро, потому что у него нет среды выполнения или сборщика мусора. Он не медленнее, чем C++, потому что по своей сути безопаснее. Та же безопасность не может быть достигнута в C++ с помощью указателей, но rust по умолчанию безопаснее. Поэтому при компиляции он подвергается различным проверкам безопасности. Проверки выполняются только во время выполнения и имеют нулевую производительность на языке. Девиз быть абстракциями с нулевой стоимостью. В результате это более безопасный язык, который по своей природе не медленнее. Поэтому он такой же быстрый, как C++ и C.

2. C++

C++ — один из самых эффективных и быстрых языков. Он широко используется конкурентоспособными программистами из-за его скорости выполнения и стандартных библиотек шаблонов (STL). Несмотря на то, что C++ более популярен, он страдает от уязвимостей, таких как ошибка буфера. C++ выполняется примерно с той же скоростью, что и его предшественник C. Единственное, что делает C++ ниже C по скорости, это то, что он безопаснее и сложнее, чем C, поэтому код C++ по умолчанию подвергается проверкам безопасности, что делает его медленнее, чем C.

Начните свой путь к изучению самого быстрого и эффективного языка C++ с Geeksforgeeks Фонд программирования C++ — Самостоятельный темп и освойте основы языка, изучая интересные темы, такие как ввод/вывод в C++, управление потоком, операторы, циклы & более.

1. C

Особенность C в том, что в нем нет ничего особенного. Он прост и очень близок к языку ассемблера. В C многие инструкции напрямую отображаются в инструкции по ассемблеру. Но невероятная скорость языка C обусловлена ​​нарушением безопасности. Известно, что C имеет наибольшее количество уязвимостей среди популярных языков. Он выполняет небезопасные инструкции без перекрестной проверки. Как и C++, он также страдает от ошибки буфера. Хотя C имеет эти недостатки, он по-прежнему возглавляет список из-за высокой скорости выполнения.


Какой самый быстрый язык программирования?

Вы можете подумать, что на вопрос: какой язык программирования самый быстрый, можно ответить одним словом? Но на самом деле, есть много технических нюансов, когда речь идет о скорости и программировании. Для начала, быстрее не обязательно лучше — это действительно зависит от варианта использования. (Но мы еще вернемся к этому.)

Здесь мы подробно расскажем, что делает язык программирования «быстрым», почему это важно и как вы можете приступить к изучению некоторых из самых быстрых языков программирования.

Что делает язык программирования быстрым?

Ключевой характеристикой языка программирования, которая определяет его скорость, является то, является ли он компилируемым или интерпретируемым языком. Компилируемые языки — такие как Lisp, C++, Go, Rust и Swift — должны быть преобразованы в машинный код (см. Ассемблер ниже), который взаимодействует непосредственно с оборудованием. Интерпретируемые языки, такие как Python, JavaScript, Ruby и PHP, работают путем преобразования вашего исходного кода на лету в машинный код по мере его выполнения. Поскольку этот процесс преобразования происходит во время выполнения кода и увеличивает нагрузку, интерпретируемые языки работают медленнее, чем компилируемые языки.

Есть несколько других факторов, которые могут определять скорость языка. Возьмите Java и C# — эти языки и компилируются, и интерпретируются. Однако вместо компиляции в ассемблерный код они компилируются в байт-код. Скомпилированный байт-код интерпретируется для работы на виртуальной машине, оптимизированной для прямого взаимодействия с оборудованием. Вы можете думать о байт-коде как о языке ассемблера для виртуальной машины. Это делает эти языки более быстрыми, чем такие языки, как JavaScript, который преобразует текстовый исходный код непосредственно в машинный код.

Еще один фактор — это язык со статической или динамической типизацией. Языки со статической типизацией определяют типы всех переменных при компиляции языка, а языки с динамической типизацией проверяют тип переменных во время выполнения кода. Эта проверка типов в реальном времени сопряжена с некоторыми накладными расходами, что делает языки с динамической типизацией медленнее, чем языки со статической типизацией.

Какие языки программирования самые быстрые?

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

Ассемблер

Язык ассемблера на самом деле не является одним конкретным языком. Это просто название, данное любому низкоуровневому языку программирования, который напрямую взаимодействует с аппаратным обеспечением компьютера. Это означает, что сборка для вашего ноутбука будет отличаться от сборки для вашего сотового телефона, потому что у них разные процессоры, требующие разных инструкций. Обычно ассемблер используют только разработчики, работающие непосредственно с оборудованием или создающие языки программирования.

Lisp

Lisp — один из первых языков программирования, которому уже более 60 лет. Было много разновидностей этого языка, и многие другие языки программирования использовали некоторые из тех же возможностей, что и Lisp. Clojure, например, — это современный диалект Lisp, реализованный для виртуальной машины Java, но не благодаря Clojure Lisp находится в этом списке. Common Lisp компилируется непосредственно на языке ассемблера, а это означает, что код, который вы пишете на Lisp, будет ассемблерным, когда он запускается как исполняемый файл. Lisp все еще используется сегодня, но чаще всего вы найдете его как Clojure, а не как Common Lisp.

C/C++

C и C++ также являются компилируемыми языками. C — это простой процедурный язык программирования, который был первоначально разработан в начале 1970-х годов и до сих пор широко используется, в основном во встроенных приложениях, из-за его скорости и небольшого размера. C++ — это язык, расширяющий C и добавляющий объектно-ориентированные функции. Из-за этого он заменил C во многих приложениях. C++ используется в ситуациях, когда важна производительность, например при разработке 3D-видеоигр и разработке операционных систем.

Go

Go, также известный как Golang, — это язык программирования, разработанный Google. Он компилируется в Ассемблер, как и большинство других языков здесь, но у него больше современных функций, более простой синтаксис и его легче писать, чем давний лидер среди быстрых языков программирования, C/C++. Golang часто используется в сетевых серверах и распределенных системах, где его скорость может повысить производительность этих систем.

Rust

Rust — еще один компилируемый язык программирования, который также является более безопасной альтернативой C/C++. Он ориентирован на скорость, безопасность памяти и параллельную обработку и часто используется в игровых движках, компонентах браузера и движках моделирования виртуальной реальности, где скорость является приоритетом.

C#

C# — это язык, подобный Java, который сначала компилируется в виртуальный язык, а затем интерпретируется виртуальной машиной. Это придает ему черты интерпретируемого языка, добавляя при этом некоторую скорость. C#, разработанный Microsoft, прост в освоении и содержит множество сторонних библиотек, которые упрощают и ускоряют разработку. Как и C++, C# универсален и используется для создания настольных приложений, видеоигр и веб-сервисов.

Java

Java компилируется в байт-код, который затем интерпретируется виртуальной машиной Java. Это был один из первых языков программирования, сделавших это, поэтому он быстро стал (и остается) популярным. Использование виртуальной машины означает, что приложение Java может быть перемещено из одной операционной системы в другую без изменения кода, если для этой операционной системы доступна версия JVM. Эта кроссплатформенная функция в сочетании с его скоростью делает Java популярным языком для многих приложений, включая веб-разработку, разработку настольных компьютеров, разработку игр, разработку мобильных приложений и многое другое.

Swift

Swift — это современный язык программирования, разработанный Apple, который компилируется в код на ассемблере. Он был разработан для замены старого языка Objective-C. Он используется для разработки ваших любимых продуктов Apple, таких как Apple TV, Apple Watch, iPhone и iPad. Swift в настоящее время является самым популярным языком разработки для Mac OS X и iOS, но он также является кроссплатформенным и начинает использоваться в других приложениях.

Дело не всегда в скорости

Хотя скорость может быть важна при выборе языка программирования, существует множество других факторов, о которых следует подумать. Когда вы пишете код, бывают случаи, когда другие особенности языка программирования важнее его скорости. В конце концов, если бы скорость была главным приоритетом для каждого проекта, языки программирования, не входящие в этот список, не имели бы большого применения, и мы бы писали код на ассемблере. Однако правда в том, что некоторые из самых популярных языков программирования даже не входят в этот список.

Скорость относительна, и во многих случаях программа на C++ будет в десять раз быстрее, чем программа на Python, но в данном конкретном приложении это не имеет значения. В конце концов, если операция завершается за 0,001 секунды, а не за 0,01 секунды, можете ли вы действительно заметить разницу? Однако разница будет иметь значение, если вам придется выполнять одну и ту же операцию тысячи раз в цикле.

В большинстве случаев скорость разработки важнее скорости исполнения. Медленную программу можно масштабировать для повышения ее производительности, выделяя на нее больше ресурсов, а вычислительные ресурсы дешевы по сравнению с оплатой большего времени разработки для написания кода на более сложном для написания языке низкого уровня. Более медленные языки программирования популярны, потому что их легче писать, они имеют множество доступных сторонних библиотек и могут быть развернуты быстрее. Все это ускоряет время разработки.

Узнать больше

Хотя скорость языка программирования не всегда является наиболее важной характеристикой, скорость имеет определенные преимущества.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *