Julia (Julia lang) Leistung im Vergleich zu Fortran und Python
Angepasst ich ein einfaches Programm zum berechnen und zeichnen Sie die Bewegung der Wirbel, der um Julia zu testen, die Sprache, ich schrieb auch es in Python keinen bestimmten Grund.
(Disclaimer: 1. Alle performance-Vergleich auf stackoverflow habe ich zu Lesen bekommt schlug für eine nicht umfassende/richtig/gut geschrieben/relevanten etc. etc. - Ich behaupte nicht, dies ist ein wirklicher Vergleich, ich würde nur gerne wissen, wie die Julia schneller. 2. Ich kenne die python optimiert werden konnten, umgesetzt in Cython etc, das ist nicht Teil dieser Diskussion, es ist nur hier, um einen Verweis auf gleichwertige Funktionen in Julia und Python.)
Den code und performance-Ergebnisse gesehen worden in einem gist.
Die Leistung von Julia ist deutlich langsamer als Fortran. Die Zeiten, die zum ausführen der Berechnung selbst sind (50000 Zeitschritte):
Fortran: 0.051s
Julia: 2.256s
Python: 30.846s
Julia ist viel langsamer (~44-mal langsam), als mit Fortran, die Lücke verengt sich, ist aber immer noch signifikant mit 10x mehr Zeit Schritte( 0.50s vs 15.24s
).
Diese Ergebnisse unterscheiden sich deutlich von denen in den Abbildungen auf die julia-Startseite. Was mache ich falsch? Konnte ich beheben, die Julia zu sein, die deutlich schneller sind?
Ich habe skim Lesen Sie die Julia-Performance-Tipps Seite und den code, der hinter dem Vergleich, auf der Julia home page und nichts steht mir zu beheben.
Interessanterweise auch Julia wird extrem langsam geladen, PyPlot ( 5secs
ish!!) und viel langsamer als Python zu Lesen, der text-Datei. Konnte ich irgendetwas tun, um zu verbessern, diese Dinge?
Beachten Sie, dass die Zeiten oben nicht zeigen Ladezeit für Julia und Python, es ist nur der raw-Zeit für die Berechnung, soweit ich weiß - siehe code. Für fortran, die ganze Sache. Das Plotten ausgeschaltet wurde, grob gesagt, in jedem Fall zu ermöglichen, Geschwindigkeits-Vergleich.
Computer: Intel i7-3770, 16GB ram, SSD, HD, OS: Ubuntu 13.10 64bit., Fortran: gfortran, GNU Fortran (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1, Julia: Version 0.3.0-prerelease+396 (2013-12-12 00:18 UTC), Commit c5364db* (0 Tage alt, master), x86_64-linux-gnu, Python: 2.7.5+
Update:
Basierend auf ivarne Rat ich schrieb die Julia script (aktualisiert im Kern oben): Strukturierung Routinearbeit in Funktionen deklarieren der Typ der alles und spaltet die verschiedenen Elemente der Matrizen in verschiedene arrays, wo anwendbar. (Ich inbegriffen Float64 in ganz wenigen Orten, wie ich habe versucht, Float32, um zu sehen, ob das geholfen, es hat nicht die meisten der Zeit).
Die Ergebnisse sind wie folgt:
50,000
mal vor:
Fortran: 0.051s (entire programme)
Julia: raw calc.: 0.201s, calc. and return (?): 0.758s, total exec.: 6.947s
500,000
mal vor:
Fortran: 0.495s (entire programme)
Julia: raw calc.: 1.547s, calc. and return (?): 2.094s, total exec.: 8.521s
Fazit:
-
Können Sie die Geschwindigkeit Julia ein wenig Recht.
-
Können Sie erhebliche Auswirkungen auf die anscheinend Geschwindigkeit von Julia je nachdem, wie Sie Messen Leistung.
- Sie erwähnte mit BLAS in den benchmarks. Und matmul Leistung ist fast identisch in Fortran, C, Julia und MATLAB, auch gibt es Weg. Es könnte nicht fairer Vergleich zwischen den Sprachen, wenn ein guter Teil der Prüfung ausgegeben wird, in einige vorkompilierte Bibliothek. Vielleicht sollten Sie versuchen, ersetzen den Teil des Codes mit BLAS Anrufe, wenn möglich und der Vergleich nochmal?
- Es gibt keine Notwendigkeit zu erklären, Typen, Funktionen in Julia, es sei denn, Sie wollen, um es für die multiple dispatch. Liste Verstehens in der Regel erhalten Sie die richtige Art ohne Mühe auch. Wenn Sie einen Typ/eine, unveränderliche Strukturen, müssen Sie erklären, Arten zu erhalten, die anständige Leistung.
- Ein +1 für gerade den Haftungsausschluss.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folge ich der Julia-Projekt für eine Weile jetzt, und ich habe einige Kommentare in den code, der relevant sein könnte.
Die Ladezeit PyPlot (und jedem anderen Paket) ist ein bekanntes Problem, und ist, da das Parsen und kompilieren von Julia-code Computer-code, ist sehr zeitaufwändig. Gibt es Ideen darüber, dass ein cache für diesen Prozess, so dass dieser Prozess wird "augenblicklich", aber es ist noch nicht fertig. Der Basis-Bibliothek ist aktuell zwischengespeicherten im kompilierten Zustand, so dass die meisten der Infrastruktur ist auf dem master-branch nun.
HINZUGEFÜGT:
Ich versuchte, führen Sie den test in einer isolierten Funktion und bekam diese Ergebnisse. Sehen Sie diese gist
Parsen:
Und Baum aufeinander folgenden Runen der Haupt-test-Schleife.
Beachten Sie, wie das timing verbesserte sich nach dem ersten Lauf, weil der kompilierte code verwendet wurde, wieder.
Update 2
Mit einigen verbesserte Speicherverwaltung (achten Sie auf die Wiederverwendung der arrays, da die Zuordnung nicht kopieren), hab ich die Timings runter auf 0,2 Sekunden (auf meinem Rechner). Es ist definitiv mehr getan werden könnte, um zu vermeiden, Zuweisung von neuen arrays, aber dann beginnt es ein wenig tricky.
Diese Zeile nicht tun, was Sie denken:
aber das tun, was Sie wollen:
und devectorize einer Schleife.
zu:
@ivarne deckt dies, aber es trägt ein wenig mehr Aufmerksamkeit:
Wow. Das ist eine Menge Zeit und Speicher.
Viel besser. Warum nicht
[:]
tun, wassub
tut? Ich weiß es nicht. Nun, ich Art zu tun. Wenn Sie gehen, um indexz[10]
Julia denkt, hrmm, z wird wie x außer die Indizes sind teilweise durch 0, soz[10]
istx[10+0]
. Dort gehen Sie. Das kleine extra neben die Kosten werden Sie auf die Dauer, wenn Sie tun eine Menge für die Indizierung. Um dies zu beheben, benötigen Sie ein Konzept, wie die Zeiger, die gegen Julias religion.Update Julia jetzt deprecates
[:]
(version 0.4.0)sammeln ist schneller
vergleichbar mit SubArrays