Vergleich der Geschwindigkeit von Programmiersprachen am Beispiel der Lösung des Problems des Trainings eines neuronalen Netzwerks

Zweck der Arbeit


Vergleichen Sie die Geschwindigkeit von Programmen, die in verschiedenen Sprachen geschrieben und auf verschiedenen Betriebssystemen ausgeführt werden. Die Ergebnisse der Arbeit sind vor allem für die Lösung von Problemen im Zusammenhang mit neuronalen Netzen interessant.

Eisen und OS


Zum Testen unter Ubuntu und Windows (DELL Inspiron-7577-Laptop):

RAM: 16 GB

CPU: Intel Core i7-7700HQ bei 8 x 3,8 GHz


Feige. 1 (Ausgabe des Screenfetch- Befehls auf einem DELL Inspiron-7577- Laptop unter Ubuntu OS )

Zum Testen unter MAC:

RAM: 8 Gbit

CPU: Intel Core i7 2,7 GHz

Wir haben auch Raspberry Pi 4:

RAM: Gbit

CPU: ARMv7 Rev. 3 (v7l) bei 4x 1,5 GHz getestet


Feige. 2 (Ausgabe des Screenfetch-Befehls auf Himbeer-Pi 4 )

Testprogramm


Um Tests durchzuführen, wurde ein Programm simuliert, das ein Netzwerk von 5 Neuronen imitierte. Ziel des Programms ist es, zu lernen, wie das Problem der Suche nach einem exklusiven oder mit einer Genauigkeit von Delta = 0,01 richtig gelöst werden kann. Alle Parameter und Eigenschaften des neuronalen Netzwerks sowie der Betriebs- und Trainingsalgorithmus wurden diesen beiden Beiträgen entnommen:

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

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

Die einzigen Änderungen waren werden in die Koeffizienten E (Epsilon) - Lerngeschwindigkeit, α (Alpha) - Moment (E = 0,3, α = 0,5) eingegeben. Bei Verwendung der im Artikel angegebenen Werte konnte das neuronale Netzwerk für eine lange Zeit (8 Stunden) keine Lösung finden.

Aufgrund seiner Struktur ist das Programm eine Art OOP-Modell, in dem die NeuronNet-Klasse mit Arrays von Objekten der Neuron- und Sinaps-Klasse arbeitet. Ein Objekt der Sinaps-Klasse enthält Verweise auf 2 Objekte der Neuron-Klasse. Für Gleitkommaberechnungen wird der doppelte Datentyp verwendet.

Testalgorithmus: 

  1. Ein Objekt der Klasse NeuronNet wird erstellt.
  2. Besteht ein Testtrainingsset. Die Ergebnisse der Arbeit des neuronalen Netzwerks vor und nach dem Training werden in der Konsole angezeigt und zum Vergleich mit den Referenznetzen verwendet.
  3. Das Programm tritt in einen endlosen Zyklus ein, in dem einmal in 100.000 Ergebnissen. Wenn der Fehler kleiner als Delta = 0,01 ist, endet der Endloszyklus. In Zukunft werde ich jeden solchen Vergleich eine Ära nennen. Wenn die Ära vergeht, die Zeit und die Ergebnisse der Berechnung des neuronalen Netzwerks für jeden Wert der Tabelle, der die Konsole ausschließt oder in dieser angezeigt wird.
  4. Nach dem Verlassen des Zyklus druckt das Programm die verstrichene Zeit von 0 bis zur letzten Ära und endet.

Das Programm wurde ursprünglich in Python3 (https://gitlab.com/di.romanov/neuron1.git) geschrieben und anschließend in Java, Kotlin, C ++ (gcc), PHP7, Ruby übersetzt


Feige. 3 (ein Beispiel für die Ausgabe eines Programms, das in der Kotlin-Sprache unter Ubuntu OS geschrieben ist)

Testergebnisse


Während der Arbeit gaben in Kotlin, Java, PHP, Ruby und Python geschriebene Programme nach dem Trainingssatz die gleichen Antworten. Die Ausgabe nach dem Trainingssatz eines in C ++ geschriebenen Programms war unterschiedlich, was zu einer Änderung der Anzahl der Epochen führte, die für ein ordnungsgemäßes Training erforderlich waren. Aus diesem Grund werden sowohl Vergleiche der Laufzeit des gesamten Programms als auch der Zeit, die für eine Ära benötigt wurde, gegeben.

Trainingszeit [ms.]
UbuntuWindowsRaspbianMAC
Python104569204239521112335621
Kotlin49684877199637775
Java48925994179737652
Rubin7968490524457229
C ++100990212000505377
php75591131170513996

Tab. 1 (Zeit des Durchgangs aller Epochen vor dem Training des neuronalen Netzes) 

Reisezeit einer Ära [ms.]
UbuntuWindowsRaspbianMAC
Python8713169424331527576
Kotlin3924051631625
Java3954851434635
Rubin6667756638040
C ++4185883421057
php63811001243168

Tab. 2 (Zeit vergeht eine Ära) 

Ergebnisanalyse



Graph. 1 (der Zeitpunkt des Durchlaufs aller Epochen für Programme, die unter Ubuntu ausgeführt werden)

Wie erwartet zeigten Kotlin und Java etwa 20-mal die gleiche Arbeitsgeschwindigkeit vor Python. Betrachten wir einige nicht so offensichtliche Beobachtungen.

Die Ergebnisse eines in C ++ geschriebenen Programms waren unerwartet langsam. Zum Teil kann dies durch die große Anzahl von Epochen erklärt werden, die sie brauchte, um die richtige Antwort zu finden. Selbst in diesem Sinne ( siehe Abbildung 2 ) bleibt es jedoch in der Geschwindigkeit hinter Java-Programmen zurück. 


Graph. 2 (Durchlaufzeit einer Ära für Programme, die unter Ubuntu OS ausgeführt werden)

Ein weiterer Grund für solche Ergebnisse kann die unterschiedliche Verwendung von Prozessorressourcen sein ( siehe Abb. 4, Abb. 5 ).


. 4 ( Ubuntu Kotlin)




Feige. 5 (Ausgabe des Ubuntu-Portmonitors während der Ausführung eines in C ++ geschriebenen Programms)

Wie Sie sehen können, verwendet Java mindestens 4 Kerne gleichzeitig, während ein C ++ - Programm einen verwendet. Dies kann jedoch die 8-fache Geschwindigkeitsüberlegenheit nicht erklären, da Java nicht alle Kerne zu 100% verwendet.

Signifikante Unterschiede in der Geschwindigkeit eines in Python geschriebenen Programms je nach Betriebssystem. Beim Ausführen von Java-Programmen unter verschiedenen Betriebssystemen betrugen die Geschwindigkeitsunterschiede nicht mehr als 40% (selbst auf verschiedenen Computern mit Ausnahme von Himbeeren). Beim Starten eines Python-Programms wurden jedoch die folgenden Werte erhalten: Ubuntu-104c, Windows-204c, MAC-335c . Das Verhältnis der Geschwindigkeit des Programms auf Kotlin zur Geschwindigkeit des Programms in Python beträgt 21 für das Ubuntu-Betriebssystem, 26 für Raspberry und bereits 43 für den Mac.

Alle interpretierten Programmiersprachen zeigten auf Raspbery die gleiche Geschwindigkeit

Python3-Übersetzungsautoren


Ruby, PHP

https://vk.com/silverlumen

Java

https://vk.com/id365699827

All Articles