Pull to refresh

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

Reading time3 min
Views36K

Цель работы


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

Железо и ОС


Для тестирования по 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
Tags:
Hubs:
Total votes 38: ↑12 and ↓26-14
Comments37

Articles