Vergleichende Benchmarks Golang – Python – Java

... aus unserem Tätigkeitsbereich
Antworten
Benutzeravatar
KlausWendel
Site Admin
Beiträge: 8
Registriert: 22. Dezember 2016 08:59

Vergleichende Benchmarks Golang – Python – Java

Beitrag von KlausWendel » 27. Januar 2017 21:11

Performance-Vergleich: Go vs. Python3 vs. PyPy3 vs. Java

Testsytem
Hardware
  • Intel 8 x Core i7-4790T CPU @ 2.70GHz, 32 GB RAM
Software
Go
* Gc, Version 1.7.4
* Gccgo, Version 4.9.3)
Java
* Java SE, Version 1.8.0_112
Python3
* CPython, Version 3.4.5
* PyPy3 Version PyPy 5.5.0-alpha0, implementiert Python 3.3.5

Testaufgabe
Durchführung der Primzahlfaktorisierung der Zahl 12361423 (= 47 * 263009) mit jeweils zwei ähnlichen Verfahren und in allen drei Sprachen nahezu identischen Codes

Referenz-Codes Ergebnis
  • Der offizielle Python3-Interpreter benötigte auf dem Testsystem für die Iterative Ermittlung der Zahlen 160.411 Sekunden und für die durch Division verkürzte Iterative Ermittlung 99.533 Sekunden.
  • Der mit dem offiziellen Go-Compiler generierte Code benötigte für dieselben Aufgaben hingegen nur 14.739 Sekunden sowie 9.738 Sekunden, war also mehr als 10 mal schneller!
  • Der mit dem Gcc-Compiler generierte Code benötigte 20.825 Sekunden sowie 13.952 Sekunden, war also immerhin noch 7 mal schneller als Python3.
  • Ein heimlicher "Gewinner" dieses Vergleichs war aber Python3 in Kombination mit dem Just-in-Time (JIT) compiler PyPy3! Dieser reichte mit 23.687 Sekunden und 14.389 Sekunden erstaunlich nah an Go heran und war nur um den Fakator 1.5 langsamer! Da bleibt zu hoffen, daß das geniale PyPy eines Tages die offizielle Python-Implementierung übernehmen wird!
  • Besonders interessant jedoch ist das weit auseinanderklaffende Ergebnis bei Java. Die rein iterative Ermittlung ist mit 49.199 Sekunden vergleichsweise langsam. Bei dem Divisionsverfahren ist Java mit 4.035 Sekunden hingegen mit großem Vorsprung Sieger, noch vor dem Go-Binary!

Benutzeravatar
KlausWendel
Site Admin
Beiträge: 8
Registriert: 22. Dezember 2016 08:59

Nebenläufige Programmierung in Go

Beitrag von KlausWendel » 27. Januar 2017 21:18

Außer Konkurrenz: Nebenläufigkeit mit Go

Referenz-Codes Ergebnis
Ein direkter Code-Vergleich mit Nebenläufigkeit ist nicht mehr repräsentativ, da sich die Codes zu sehr unterscheiden. Für Go ist hier mal eine Variante umgesetzt worden, die dem Iterativen Verfahren ähnelt – mit dem Unterschied, daß die erste Primzahl nicht über eine Schleife generiert wird, sondern von der jeweiligen Go-Routine über eine closure-Funktion abgerufen wird. Das ist notwendig, damit jede Go-Routine eine eigenständige und exklusive Aufgabe lösen kann.
  • Im Versuch mit dem offiziellen Go-Compiler und 7 Go-Routinen (Prozessorkerne - 1) wurde eine Rechenzeit von 2.328 Sekunden erzielt, beim Gcc-Compiler waren es 3.531 Sekunden.
  • Interessanterweise ist dieses Rechenverfahren dem oben verwendeten, scheinbar einfacheren iterativen Verfahren selbst dann noch überlegen, wenn nur eine einzige Go-Routine zur Berechnung verwendet wird (5.072 Sekunden, offizieller Go-Compiler).

Benutzeravatar
KlausWendel
Site Admin
Beiträge: 8
Registriert: 22. Dezember 2016 08:59

Benchmarks Golang – Python – Java mit dem Raspberry Pi3

Beitrag von KlausWendel » 28. Januar 2017 10:58

Der gleiche Test mit dem Raspberry Pi3 (ohne Übertaktung) führt zu folgenden Ergebnissen:

Java (Java SE 1.8.0_112)
Iteration: 1064.405 Sekunden
Division: 76.166 Sekunden

Go (go version 1.7.4)
Iteration: 183.324 Sekunden
Division: 120.431 Sekunden

Python3 (Python version 3.4.3)
Iteration: 1822.384 Sekunden
Division: 1138.379 Sekunden

Mit Nebenläufigkeit (außer Konkurrenz)
Go (go version 1.7.4)
Iteration: 25.549 Sekunden

Benutzeravatar
KlausWendel
Site Admin
Beiträge: 8
Registriert: 22. Dezember 2016 08:59

Signifikant schnellere Lösung mit dem Sieb des Eratosthenes

Beitrag von KlausWendel » 1. März 2017 21:34

Unter Zuhilfenahme des Siebes des Eratosthenes läßt sich diese Aufgabe übrigens signifikant schneller lösen:

Hardware
  • Intel 8 x Core i7-4790T CPU @ 2.70GHz, 32 GB RAM
Software

* Go (Gc), Version 1.8
Gesucht werden exakt zwei Primfaktoren der Zahl 12361423
Ermittlung der Primzahlen bis 6180711: 0.01921 Sekunden

[GoSdEI] Erfolgreich beendet bei 47 * 263009 = 12361423
[GoSdEI] Iterative Ermittlung mit Sieb des Eratosthenes: 0.03521 Sekunden

[GoSdED] Erfolgreich beendet bei 47 * 263009 = 12361423
[GoSdED] Ermittlung mit Benischek-Division und Sieb des Eratosthenes: 0.00049 Sekunden
Referenz-Code

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast