Цель работы
Сравнить скорости работы программ написанных на различных языках и запускаемых на различных операционных системах. Результаты работы прежде всего интересны для решения задач связанных с нейросетями.
Железо и ОС
Для тестирования по 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.
Алгоритм тестирования:
- Создается объект класса NeuronNet
- Проходит тестовый обучающий сет. Результаты работы нейросети до обучения и после выводятся в консоль и используются для сравнения с эталонными.
- Программа входит в бесконечный цикл где раз в 100000
итераций происходит сравнение результатов работы нейросети с эталонными
результатами. В случае если погрешность составляет менее delta = 0.01 бесконечный цикл завершается. Каждое такое сравнение в дальнейшем буду называть эпохой. При прохождении эпохи в консоль выводится время которое она заняла и результаты расчета нейросети для каждого значения таблицы исключающего или. - После выхода из цикла программа распечатывает время прошедшее с 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