Сравнение скорости работы языков программирования на примере решения задачи обучения нейронной сети
Цель работы
Сравнить скорости работы программ написанных на различных языках и запускаемых на различных операционных системах. Результаты работы прежде всего интересны для решения задач связанных с нейросетями.
Железо и ОС
Для тестирования по Ubuntu и Windows ( ноутбук DELL Inspiron-7577):
CPU: Intel Core i7-7700HQ @ 8x 3.8GHz
рис. 1 (вывод команды screenfetch на ноутбуке DELL Inspiron-7577 под ОС Ubuntu)
Для тестирования на под MAC:
CPU: Intel Core i7 2.7GHz
Так-же мы провели тесты на Raspberry pi 4:
CPU: ARMv7 rev 3 (v7l) @ 4x 1,5Ghz
рис. 2 (вывод команды screenfetch на raspberry pi 4)
Программа для тестирования
Для проведения тестов была написана программа имитирующая сеть из 5 нейронов, целью программы является научится правильно решать задачу нахождения исключающего или с точностью delta = 0.01. Все параметры и свойства нейросети, а также алгоритм работы и обучения были взяты из этих 2 постов:
Единственные изменения были внесены в коэффиценты E (эпсилон) — скорость обучения, α (альфа) — момент (E = 0.3, α = 0.5). При использовании значений указанных в статье нейросеть в течении длительного времени (8 ч.) не могла найти решения.
По своей структуре программа представляет из себя некую ООП модель, в которой класс NeuronNet оперирует массивами объектов класса Neuron и Sinaps. Объект класса Sinaps содержит в себе ссылки на 2 объекта класса Neuron. Для расчетов с плавающей точкой применяется тип данных double.
Алгоритм тестирования:
рис. 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
«Дело было вечером, делать было нечего» или краткая история о сравнении производительности языков программирования
«Бенч» дело такое. После нескольких дней бездействия начинается ломка, хочется занять себя чем-нибудь. Иногда я отвлекался на pet-проекты, иногда на чтение литературы. Сейчас же я расскажу о том что случилось во время последнего «режима ожидания».
Меня многие годы волновала производительность ЯП (в основном интересовал PHP). Список ниже содержал некоторые мои убеждения, до недавнего времени:
PHP один из самых медленных языков программирования
Python быстрее PHP
C/C++ намного быстрее Python и PHP вместе взятых
Assembler на порядок быстрее C/C++
Первым делом нужно было определиться какой тест взять за основу. А давайте попробуем написать программу нахождения простых чисел (я в курсе что есть много алгоритмов нахождения простых чисел, неплохая статья на данную тему).
За основу был взят следующий код (примитивный перебор, который даже не прекращается, если уже знает что число не простое):
А дальше все как в тумане: Python, C/C++, Pascal, Go и тд. Все исходники можно глянуть здесь. Все тесты я делал в докере, чтобы не засорять комп.
Потом я наткнулся на книги Андрея Викторовича Столярова, и все завертелось с еще большей силой. Assembler я не трогал со времен универа, но после прочтения книги очень захотелось что-то написать. Могу сразу сказать, что тест для Assembler/NASM я писал больше недели, хотя на любой ЯП из тех что представлены в репозитории уходило не больше часа.
Вот в принципе и результат моей работы:
После того как начали появляться первые результаты, я удивлялся все сильнее и сильнее:
оказывается PHP быстрее Python и Ruby
PHP вообще один из самых быстрых интерпретируемых языков
Python 3 медленнее Python 2
разница в работе программы написанной на С/C++ и Assembler/NASM в районе 15%
после Rust пришлось добавить тесты с флагом на компиляцию с оптимизацией
На данный момент я планирую постепенно добавлять новые тесты (когда позволяет время и настроение).
Цель данной статьи стоит не в том, чтобы показать какой ЯП самый быстрый, а в том что мы можем ошибаться в своих убеждениях, и что не стоит верить всем байкам в курилке (многие из моих заблуждений именно оттуда, кто-то где-то слышал что X быстрее Y).
PPS. Добавил Ruby 3, что-то не сильно помогло.
PPPS. Изменил метод подсчета времени выполнения, увеличил порядковый номер простого числа (с 5000 на 7000).
PPPPS. Добавил Haskell.
PPPPPS. Добавил Lua (LuaJIT) и Python 2/3 (PyPy).
Лучший язык программирования
Вопрос, который часто задают начинающие программисты — какой язык программирования изучать? Вопрос звучит разумно. Хочется выбрать самый лучший, чтобы потом не пришлось переучиваться.
Можно ли на него ответить?
Я работаю программистом тридцать лет. За эти годы индустрия несколько раз претерпевала кардинальные изменения. У меня были любимые языки, но ни один из них не стал единственным выбором на долгое время. И дело не в том, что я меняю языки, как перчатки. Меняется сама жизнь.
В конце 90-х я писал на С++ и присматривался к вебу. Писать веб-приложения на C++ было безумием. Тогда не было ни Python, ни Ruby, ни C#, и даже PHP был в зачаточном состоянии. Свои первые программы для веба я написал на Perl. Сейчас проект на Perl назовут глубоко и безоговорочно устаревшим.
Все тридцать лет мне постоянно приходится изучать новые языки программирования. Причиной тому не только любознательность, но и банальная жизненная необходимость. Сегодня востребованы программисты на Python, Go, C#, Java. То, что я знаю язык Ассемблера и Delphi, не помогает мне найти интересную высокооплачиваемую работу. В индустрии ходят слухи о баснословных зарплатах программистов на COBOL. Не знаю. Не уверен. Программисты на Go сейчас гораздо нужнее.
Если постоянно приходится учить новые языки, значит, лучшего языка в принципе не существует. Что же тогда делать начинающему программисту?
Ответ — научиться быстро осваивать новые языки. Чтобы проиллюстрировать эту мысль, расскажу историю из жизни. Обычно изучение нового языка занимает несколько дней, иногда недель, но C# я выучил за двадцать минут.
Я много лет писал на C++, потом неплохо освоил Java и, оказалось, что все основные концепции C# были мне знакомы. Знатокам C# напомню, что речь идёт про 2003 год, когда в языке не было ни LINQ, ни async/await, ни даже обобщённого программирования.
Я открыл MSDN, прочитал несколько страниц, и написал первый код, который сразу ушёл в прод. Конечно, я не знал язык полностью — пара моментов потребовала дополнительного освоения. В частности, новой для меня оказалась концепция делегатов. В C++ и Java есть свои способы, чтобы работать с указателями на функцию, а в C# для этого придумали новое средство языка.
Потребовалось время, чтобы уложить в голове всё, что связано с новинкой, в частности, чтобы понять, чем делегаты отличаются от событий. Но, даже не владея этими аспектами языка, я уже писал рабочий код.
Языки программирования похожи друг на друга. Они образуют целые семейства с общими идеями, а иногда даже и общим синтаксисом. Скажем, C++, Java и C# очень похожи друг на друга не только концептуально, но и синтаксически.
Зная один язык из семейства, вы быстро начнёте писать на родственном языке, даже если у него будет непохожий синтаксис. В этом ключ к быстрому изучению языков.
Освойте несколько языков из кардинально разных семейств, и вам будут знакомы большинство концепций, встречающихся в современных языках программирования.
Семейства языков
Мы ступаем на нетвёрдую почву классификаций. Что бы я ни написал, найдётся читатель, не согласный с предложенными критериями. Я, тем не менее, попробую, и начну с общепризнанных устоявшихся способов разделить языки на группы.
Исторически, самая ранняя классификация касается первых языков программирования высокого уровня — Fortran и LISP. Первый из них был императивным, то есть состоял из императивов. Слово императив в русском языке используют редко, нам привычнее слово команда. Программа на императивном языке программирования — это последовательность команд, которые выполняет компьютер.
Второй — LISP — положил начало функциональным языкам. Вместо команд здесь используют примитивные чистые функции, которые комбинируют в чуть более крупные функции, а те, в свою очередь — в ещё более крупные. В конечном счёте, программа на функциональном языке — это одна большая функция, которую компьютер и вычисляет.
К императивным языкам, помимо Fortran, можно отнести Pascal, C, C++, Java, C#, Python, Go. К функциональным — Haskell, Scala, Erlang, Clojure, Scheme, F#.
В этой классификации есть изъяны. Во-первых, не все согласны с простым определением функциональных языков. Некоторые специалисты считают, что истинно функциональными можно считать только чистые функциональные языки. Из известных это, фактически, только Haskell.
Во-вторых, современные языки поддерживают сразу несколько парадигм. Лямбда-функции, являющиеся основой основ функциональных языков, сейчас можно встретить во многих императивных языках, включая C++.
Несмотря на недостатки классификации, я рекомендую следовать первоначальному плану. Возьмите пару императивных языков и пару функциональных, и напишите на них несколько небольших программ. Будет здорово, если вы выберете языки с разным синтаксисом.
Незнакомый синтаксис заставляет считать новые языки непонятными. Но в действительности, к нему можно привыкнуть всего за несколько дней. Незнакомые концепции могут оказаться гораздо сложнее.
В императивных языках долгое время существовало разделение на код и данные, при этом код управлял данными. Языки такого рода сейчас называют процедурными, к ним, например, относят Fortran, Pascal и C.
В противовес им, в объектно-ориентированных языках программист размещает код и данные вместе, и называет объектом. К таким языкам относят C++, Object Pascal, Java, C#, JavaScript.
Существуют ли объектно-ориентированные функциональные языки? Да, конечно. Обычно разработчики языка совмещают несколько разных парадигм, что, кстати, значительно облегчает нашу задачу, а именно, освоение разных концепций. И если Pascal — императивный и процедурный, то OCaml — функциональный и объекто-ориентированный.
Языки также классифицируют по тому, как они работают с типами данных. Разделяют статически типизированные и динамически типизированные языки, а также языки с сильной и слабой типизацией.
Динамически типизированные языки часто используют для разработки небольших программ — скриптов или сценариев. Они просты в изучении, нетребовательны к квалификации программиста и обычно позволяют писать короткий код. К ним относят JavaScript, Python, PHP, Ruby.
Статически типизированные языки проверяют соответствие типов данных, поэтому программисту приходится описывать объекты, которые он использует. Это касается и переменных, и функций, и даже самих типов. Программы на таких языках обычно больше по размеру, поскольку, в определённом смысле, дублирование помогает справляться с опечатками и другими простыми ошибками. В этой категории мы обнаружим C++, Java, C#, Kotlin, Go.
Ещё один признанный способ классификации — разделение языков на низкоуровневые и высокоуровневые. Языки низкого уровня используют в системном программировании и разработке игр, то есть там, где требуется высокая производительность кода и экономия ресурсов. К ним относят C, C++, Rust и, в какой-то мере, Go.
Языки высокого уровня повышают производительность программиста. Ему не приходится распределять память или вручную обрабатывать строки, он занимается решением бизнес-задач. В категорию высокоуровневых входят Java, C#, Scala, Python, Ruby.
Если языку программирования не хватает скорости, часть программы пишут на низкоуровневом языке и вызывают этот быстрый код из языка высокого уровня. Подобное смешение возможно за счёт техник, которые в целом называют Foreign Function Interface (FFI), или Интерфейс Внешних Функций.
Наконец, языки бывают универсальные и нишевые. Это условное разделение, поскольку нишевые языки практически не похожи друг на друга. Просто надо помнить, что для работы с базами данных придётся учить SQL, для разработки фронтенда — JavaScript, а для проектирования iOS приложений — Swift.
Фундамент
Помимо лингвистических знаний в быстро меняющемся мире важны знания фундаментальные. Те, что не потеряют своей актуальности и через десять лет, и через двадцать.
Очевидная база для программистов — алгоритмы и структуры данных. Она вызывает серьёзные споры, потому что у многих программистов эти знания зачастую не востребованы. Как говорят в интернет-баталиях, чтобы пилить круды, алгоритмы не нужны. И в этом есть доля истины.
Но здесь полезно вспомнить историю. Двадцать лет назад круды пилили не на Python, а на Delphi. Бекенд писали на Perl. За свою карьеру, хотите вы этого или нет, вы несколько раз поменяете стек. И, возможно, единственное, что вам не придётся изучать на новых платформах — это фундамент.
Время от времени вам будут попадаться алгоритмические задачи. Полезно иметь представление об алгоритмах, чтобы писать быстрый код. Тем более, что разбираться с темой придётся только единожды.
Не языками едиными
Кроме языков программирования, нам нужны инструменты и методологии. Где бы вы ни работали, вам наверняка пригодится git. Даже если вы не работаете в команде, заведите аккаунт на GitHub и держите там домашние проекты.
Разберитесь с непрерывной интеграцией и развёртыванием — CI/CD. Настройте автоматическую сборку своих проектов.
Научитесь писать модульные тесты. Сделайте тестирование одним из этапов сборки, чтобы ваш проект собирался только в случае, если проходят все тесты.
Доведите знание английского до уровня B2 — Upper Intermediate. Этого достаточно, чтобы воспринимать английскую речь на слух, общаться с носителями языка и писать письма.
Я учил английский в школе. Мне хватало его, чтобы читать документацию и немного писать. Но сейчас, во времена YouTube, новые знаниях приходят к нам через видео лекции и доклады. Приходится доучивать английский, чтобы не перекрывать себе этот важнейший канал.
Заключение
Что можно сказать про индустрию, проработав в ней тридцать лет? Технологии умирают, и умирают быстро. Больше нет dBASE и Clarion, и даже названия эти современным программистам неведомы. Священная война между Pascal и C, которая шла все восьмидесятые, как-то обыденно закончилась победой C. Но сейчас это никого не волнует — что нам Pascal и C, когда мы пишем на Java?
Мы учимся, зная, что 90% новых знаний устареют уже через три года. Возможно, нам надо освоить ещё два навыка.
Умение забывать. И умение не учить всё подряд, особенно если это всё очень модное и современное. Никто не знает, какой срок отмерен модным технологиям. Будьте избирательны.
Древнейший язык программирования восстал из мёртвых и хочет стать популярным
Язык программирования, придуманный ещё в пятидесятые, до сих пор живёт и здравствует. Разбираемся, кому и для чего нужен Fortran в 2k21.
Абрикос Абрикосовый для Skillbox Media
Вы не найдёте Fortran в топ-10 самых популярных языков программирования. Тем не менее он занимал 17-е место в индексе TIOBE в июне 2021 года, хотя годом ранее еле-еле добрался до 37-го.
Программистское сообщество в шоке — на Quora даже появился большой топик под названием «Is Fortran Still Alive?» (кстати, у этого топика уже есть конкуренты — вот пример). В причинах резкого взлёта популярности Fortran пытаются разобраться опытные разработчики-полиглоты, учёные, ИТ-менеджеры и даже бывший член комитета по стандартам ISO / ANSI J3 Fortran Крейг Дедо. Мы выбрали самые важные комментарии и попытались понять, почему Fortran воскрес подобно фениксу. Получилось четыре причины — немного не дотянули до Игоря Николаева. Кстати, этот старичок стрельнул не один — сейчас на западе настоящий бум на COBOL-программистов.
Причина №1
Нет смысла переписывать программы, написанные на Fortran
Многие программные пакеты для прогнозирования погоды, мониторинга дорожного движения и так далее разработали ещё в 1980-х годах — и учёные до сих пор пользуются ими. А если что-то работает хорошо, зачем это ломать?
«Благодаря эффективности языка и его способности переиспользовать старый код многие поколения студентов-физиков до сих пор создают программы на Fortran на основе старых программ и фрагментов кода своих научных руководителей».
Переписывать на другой язык качественный и отполированный за десятки лет код — пустая трата денег, тем более когда у всех есть проблемы с настоящим техдолгом. Поэтому многие продолжают использовать Fortran в вычислениях — там он пока незаменим.
«Fortran всё ещё актуален в высокопроизводительных научных вычислениях — здесь он всегда сохранял лидерство. И я не вижу, чтобы ситуация как-то резко изменилась. Ценность вычислений на Fortran всё ещё очень высока. А Fortran-код чрезвычайно важен для человечества во многих сферах: прогноз погоды, создание новых лекарств, физика высоких энергий, геотермальное картографирование. В общем, всё, что называется „глобальными вызовами“. И Fortran здесь — замечательный инструмент. Хотя большинство людей из мира ИТ вряд ли захотят или должны будут его использовать».
Причина №2
Fortran незаменим в естественных науках
Само название Fortran — сокращение от «Formula translation». Много лет этот язык использовали инженеры, и на нём написано множество лучших инженерных программ. Например, программы для решения задач с матрицами (matrix solvers) используются при конструировании самолётов, зданий, автомобилей и так далее.
К тому же у Fortran очень лаконичный и простой встроенный синтаксис для распределённого параллельного программирования.
«Fortran по-прежнему популярен в научных кругах. Особенно в суперкомпьютерном моделировании. Никакой другой язык не сравнится с его возможностями векторизации».
Ричард Кеннет Энг,
бывший руководитель проектной группы ATI Technologies
За 60 лет пользователи написали под Fortran множество программ, библиотек, алгоритмов и подпрограмм для любых вычислений. В арсенале «дедушки» — работа с комплексными числами, операции с матрицами и даже Coarray для параллельных вычислений.
Вот примеры важных для научного сообщества программ на Fortran:
«Поразительные объёмы кодовой базы на Fortran поддерживаются и совместно используются многочисленными группами исследователей».
Ян Кристиан Мейер,
доктор в сфере компьютерных наук
«В основном Fortran используют учёные — для численного моделирования. Отчасти это связано с традицией, отчасти с тем, что синтаксис языка позволяет сделать многие операции куда быстрее и проще, чем на других языках. Например, когда дело доходит до работы с массивами, матрицами или комплексными числами. Ещё одна причина — часть самых важных библиотек линейной алгебры (LAPACK, BLAS и ARPACK) изначально были написаны на Fortran и, кажется, лучше всего оптимизированы именно под него».
Симоне Стурниоло,
учёный
Причина №3
Fortran — самый быстрый язык программирования
Fortran даже быстрее Си — поэтому учёные выбирают его для самых скоростных и сложных вычислений.
«Fortran — единственный язык низкого уровня, который рассматривает массив как первый объект, его можно даже комбинировать с С, Python (а ещё с библиотекой gnuplot) и даже shell-скриптами. Лично я использую Fortran для решения сложных задач биологической физики и могу сказать, что вы ни разу не пожалеете, если предпочтёте его любому „современному языку программирования“ в любой естественно-научной дисциплине».
Виджай Кумар,
сотрудник проекта DST в Индийском институте науки
Правда, выигрыш в скорости будет ощутимым только при работе с суперкомпьютерами над сверхсложными вычислениями. И если вы не физик из Министерства энергетики США, у которого случайно есть доступ к суперкомпьютеру IBM BlueGene/Q, или не занимаетесь криптографией в Агентстве национальной безопасности на суперкомпьютере Cray, вы вряд ли почувствуете разницу между Си и Fortran или C++ и Fortran. Но если у вас на работе всё-таки есть суперкомпьютер и сложные задачи, то компилятор Fortran покажет вам чудо.
«Люди используют Fortran, когда Си недостаточно быстр, — обычно это происходит при обработке гигантских многомерных матриц. После 60 лет разработки компилятор Fortran обошёл всех в этой узкой нише».
Дерек Росс,
программист на Fortran с 1975 года
Причина 4
Fortran никогда не умирал — и даже развивался
Fortran и его стандарты всё ещё развиваются — у него куча релизов и стандартов, каждый из которых расширяет язык, но сохраняет совместимость с предыдущими версиями:
«Сегодняшний Fortran — это не тот язык, который я учил в 1975 году, а мой отец — в конце 1950-х. Например, в первых версиях он был неструктурированным языком. А сегодня он уже структурирован и содержит конструкции, аналогичные Algol, — при этом вы всё так же легко можете скомпилировать версию F77 (или даже Fortran-IV). И это удивительно! Разработчикам языка удалось сделать современный язык и сохранить прошлое».
Клем Коул,
хакер и программист
Кому пригодится Fortran
Fortran — отличный язык для разработки приложений, причём не только научных. Его функции позволяют разрабатывать программное обеспечение на более высоком уровне абстракции, чем в Си-подобных языках. А значит, разработчик может фокусироваться на создании приложения, а не погружаться в низкоуровневые вопросы и бороться с ограничениями языка. При этом скорость исполнения остаётся космической.
Поэтому Fortran до сих пор используют — даже в правительстве США. Например, в 2017 году NASA провело конкурс по улучшению своего кода на Fortran.
« Кажется, большая часть аэрокосмических компаний по-прежнему использует Fortran — но косвенно, через купленное когда-то ПО для анализа, написанное на этом языке. Насколько я понимаю, Fortran — основа службы прогноза погоды США. Очень сложные программы для расчёта климатических моделей написаны именно на Fortran».
Марк Шлокер,
разработчик
«Я знаю двух подрядчиков из оборонки, которые пишут новые проекты и поддерживают крупные существующие проекты на Fortran. Этот язык по-прежнему широко используется в суперкомпьютерах, математике, научном моделировании, высокопроизводительных библиотеках».
Кен Грегг,
программный инженер и менеджер
А вот если вам надо разработать ПО с прямой адресацией памяти или напрямую взаимодействовать с аппаратными устройствами, то Fortran не подойдёт.
«На Fortran можно писать программы с графическим интерфейсом (GUI), но это довольно неудобный процесс, потому что почти все библиотеки для разработки GUI написаны без учёта потребностей программистов на Fortran. Предполагалось, что программисты будут писать приложения на Си, C++, C # или чем-то подобном. Соглашения о вызове процедур в Fortran сильно отличаются от таковых в Си-подобных языках, поэтому приходится вносить много ручных корректировок, чтобы вызывать процедуры в GUI-библиотеках».
Крейг Дедо,
бывший член комитета по стандартам ISO / ANSI J3 Fortran
Как и для чего появился Fortran
Fortran разработали в IBM ещё в 1957 году — специально под компьютер IBM 704. Это был первый язык программирования высокого уровня, и он быстро завоевал популярность благодаря структурам управления и компонентам ввода. Поэтому другие производители тут же начали создавать компиляторы Fortran для своих компьютеров. К началу шестидесятых годов у Fortran были уже десятки компиляторов.
А ещё Fortran — первый язык со своим стандартом ANSI. Кстати, ANSI входит в ISO (International Organization for Standardization), который регулярно обновляет спецификации языка, — а значит, он и не собирается умирать.
Стандартизация сделала Fortran идеальным для сложных вычислений. И даже сегодня это самый популярный язык для вычислений — а вы думали, там правят бал эти ваши хипстерские питоны, ары и джулии?
Но если вы не седовласый как лунь учёный-академист, который уже пару тысяч лет программирует на Fortran и до сих пор носит в портфеле восьмидюймовые дискеты, рекомендуем изучить что-то более стильное, модное и молодёжное. Например, Java или Python. Подходящий курс можно выбрать в разделе «Программирование» Skillbox.
Индекс TIOBE — это показатель популярности языков программирования. На рейтинг влияет количество курсов и разработчиков на языке, а также популярность запросов в поисковиках Google, Bing, Yahoo, Wikipedia, Amazon, YouTube и Baidu.
Rust или Си: кто Усэйн Болт в мире программирования?
Си — это сэнсэй черепашек-ниндзя
Си — это императивный язык программирования общего назначения и один из старейших (создаваться он начал в 1969 году). Его отцом-основателем является Деннис Ритчи. В 1989 году Американский национальный институт стандартов и Международная организация по стандартизации разработали новые консенсусные стандарты для Си. Будучи простым, низкоуровневым языком программирования, который работает на различных платформах, он и сейчас остаётся универсальным и по-прежнему широко используется.
Бытовые приборы, такие как микроволновые печи, стиральные машины и цифровые фотокамеры, с каждым днём становятся всё более совершенными. Об этом свидетельствует наличие в них микропроцессора, операционной системы и программного обеспечения. Эти программы должны работать эффективно, задействуя при этом небольшой объём памяти. Неудивительно, что они пишутся на Си.
Основные части популярных операционных систем, таких как Windows, UNIX и Linux, написаны на Си. Ведь даже сегодня по производительности языку Си нет равных, хотя это не означает, что так будет всегда. Кроме того, если требуется расширить операционную систему для работы с новыми устройствами, нужны программы-драйверы устройств. И эти программы тоже пишутся исключительно на Си.
Язык Си оказывает огромное влияние на сферу информационных технологий и по-прежнему играет здесь жизненно важную роль.
Rust — потенциальный конкурент во всех областях
Rust — это мультипарадигмальный язык программирования с упором на производительность и безопасность, и особенно на безопасный параллелизм. С точки зрения синтаксиса Rust аналогичен языку C++. А что касается безопасности при работе с памятью, Rust обходится без сборки мусора: вместо неё здесь система проверки заимствования.
Разработка Rust была начата Грейдоном Хором в сообществе Mozilla Research.
В Rust основной акцент сделан на:
Безопасность при работе с памятью
Основное преимущество Rust: он гарантирует, что во время компиляции приложение будет избавлено от разыменования нулевых или висячих указателей. К тому же, Rust затрудняет возникновение утечки памяти.
В языке Rust сборщик мусора не предусмотрен. Rust узнаёт о том, когда переменная выходит из области видимости или когда её время жизни заканчивается, во время компиляции. После чего вводит соответствующие команды ассемблера/LLVM для освобождения памяти. Это повышает производительность во время выполнения.
Потоки в Rust автоматически «изолируются» друг от друга благодаря такому понятию, как владение. Запись происходит, только когда поток имеет изменяемый доступ — либо владея данными, либо имея изменяемое заимствование. В обоих случаях поток гарантированно будет единственным, имеющим доступ в любой момент времени.
Поддержка Web Assembly
Web Assembly помогает выполнять алгоритмы с большим объёмом вычислений в браузере, на встроенных устройствах или где-либо ещё. Он запускается со скоростью машинного кода. Rust компилируется в Web Assembly с целью быстрого и надежного выполнения.
Сравнение скорости Си и Rust
Методология
Для сравнения скорости этих двух языков применятся такой подход: пишутся самые популярные алгоритмы сортировки, которые запускаются для различных диапазонов элементов. При этом оценивается, у какого языка сортировка элементов заняла больше времени.
Используются следующие алгоритмы сортировки:
Колонки со сложностью в худшем случае (Worst Case) позволяют примерно определить, какой метод сортировки будет выполняться хуже всех.
Для сортировки пузырьком сложность в худшем случае составит O(N²). Это будет худшее выполнение по сравнению с другими методами сортировки. Будет сгенерирована итоговая матрица, которая поможет определить временную сложность в худшем случае. Для этого надо сравнить время, необходимое для сортировки элементов.
Таким образом пишутся все пять алгоритмов на Си и на Rust. Для цели ввода используется массив целых чисел, заполняемый случайными числами с помощью функции-генератора случайных чисел rand() на Си и rand::Rng на Rust. Этот массив задаётся в качестве входных данных для алгоритмов сортировки, а выходные данные записываются в матрицу. Дальше тестируется производительность алгоритмов для трёх диапазонов: 1000, 10 000 и 100 000 элементов.
Такой набор значений запускается в течение 100 итераций, а для генерации матрицы выходных данных выполняется усреднение.
Конфигурация для сравнения производительности
Конфигурация системы, в которой был запущен и выполнен подсчёт значений:
Машина: MacBook Pro (16 дюймов, 2019 года).
Процессор: 2,3 ГГц 8-ядерный Intel Core i9.
Память: 16 Гб 2667 МГц DDR4.
rustc 1.45.2 (флаг оптимизации — release).
Статистика производительности
Ниже приводятся сгенерированные матрицы выходных данных:
Матрица выходных данных показывает примерно равные результаты. Для каждого метода сортировки и каждого диапазона входных массивов в каких-то случаях Rust работает лучше, а в каких-то случаях лучше работает Си. В нижних диапазонах (1000 элементов), за исключением сортировки вставками, Rust работает лучше. В диапазоне 10 000 элементов Cи работает лучше во всех методах сортировки.
Гистограммы тоже показывают, что результаты почти одинаковы во всех случаях.
Можете попробовать, что получится на вашем компьютере.
Вот ссылка на Github проекта.
Заключение
Сложно сказать, какой язык быстрее, потому что это зависит от конкретного случая. Но Rust может составить конкуренцию в скорости языку Cи: он быстрее, чем многие другие популярные языки, такие как Java и Python. Помимо скорости, в Rust акцент сделан на таких функциональных возможностях, как безопасная работа с памятью и параллелизм. А кроме того, у него открытый исходный код, так что Rust используют для создания самых разнообразных программных продуктов, например игровых движков, операционных систем, файловых систем, браузерных компонентов, а также машин для моделирования виртуальной реальности. Так что в ближайшее время Rust наверняка будет уже везде.










