2012-04-22 19 views
45

Julia Sprache kompiliert das Skript jedes Mal, können wir nicht Binaries mit Julia stattdessen kompilieren? Ich probierte ein kleines Helloworld-Skript mit println-Funktion es dauerte 2,3 Sekunden für Julia, um die Ausgabe zu zeigen! Es wäre besser, wenn wir Binaries anstelle der Kompilierung jedes Mal machen könntenJulia kompiliert das Skript jedes Mal?

Update: Es gab einige Änderungen in Julia, seit ich diese Frage gestellt habe. Obwohl ich die Updates für julia nicht mehr befolge, da ich diese Frage gestellt habe und du nach etwas ähnlichem suchst, schaue in die folgenden Antworten und Kommentare von Leuten, die julia folgen.

Auch ist es gut zu wissen, dass es jetzt dauert etwa 150ms, um ein Skript zu laden.

Antwort

35

Im Moment kompiliert Julia JIT beim Start die gesamte Standardbibliothek. Wir sind uns der Situation bewusst und arbeiten derzeit daran, die LLVM-JIT-Ausgabe zwischenzuspeichern, um die Situation zu beheben, aber bis dahin gibt es keinen Weg (außer der Verwendung der REPL).

+17

Dies wurde in den Julia Nightlies implementiert und wird in der Version 0.3 enthalten sein. Die Startzeit wird erheblich verbessert. –

88

Kenos Antwort ist genau richtig, aber vielleicht kann ich ein bisschen mehr darüber erzählen, was vor sich geht und was wir vorhaben.

Derzeit gibt es nur einen LLVM JIT-Modus:

  • Es gibt ein sehr triviales Interpreter für einige einfache Top-Level-Anweisungen.
  • Der gesamte andere Code wird vor der Ausführung in den Maschinencode übertragen. Der Code wird unter Verwendung der Laufzeittypen der Werte, auf die der Code angewendet wird, aggressiv spezialisiert und über das Programm unter Verwendung der dynamischen Typinferenz verbreitet.

Dies ist, wie Julia auch gute Leistung erhält, wenn der Code ohne Typenannotationen geschrieben: Wenn Sie rufen f(1) Sie Code erhalten spezialisiert für Int64 - die Art der 1 auf 64-Bit-Systemen; Wenn Sie f(1.0) anrufen, erhalten Sie eine neue Version, die auf Float64 - den Typ 1.0 auf allen Systemen spezialisiert ist. Da jede kompilierte Version der Funktion weiß, welche Typen sie bekommen wird, kann sie mit C-ähnlicher Geschwindigkeit laufen. Sie können dies sabotieren, indem Sie "type-unstable" -Funktionen schreiben und verwenden, deren Rückgabetyp von Laufzeitdaten und nicht nur von Typen abhängt, aber wir haben große Sorgfalt darauf verwendet, die Kernsprache und die Standardbibliothek nicht zu entwerfen.

Die meisten von Julia ist in sich selbst geschrieben, dann geparsed, type-abgeleitete und jitted, so Bootstrapping das gesamte System von Grund auf dauert etwa 15-20 Sekunden. Um es schneller zu machen, haben wir ein gestaffeltes System, in dem wir eine serialisierte Version des typabgeleiteten AST in der Datei sys.ji analysieren, typenableiten und dann zwischenspeichern. Diese Datei wird dann geladen und zum Ausführen des Systems verwendet, wenn Sie julia ausführen. Kein LLVM-Code oder Maschinencode wird jedoch in sys.ji zwischengespeichert, so dass das gesamte LLVM-Jitting immer noch ausgeführt werden muss, wenn julia startet, was ungefähr 2 Sekunden dauert.

Diese Startverzögerung von 2 Sekunden ist ziemlich nervig und wir haben einen Plan, um es zu beheben. Der grundlegende Plan ist, in der Lage zu sein, ganze Julia-Programme zu Binärdateien zu kompilieren: entweder ausführbare Dateien, die ausgeführt werden können, oder gemeinsame Bibliotheken, die von anderen Programmen aufgerufen werden können, als wären sie einfach gemeinsam genutzte C-Bibliotheken. Die Startzeit für eine Binärdatei ist wie bei jedem anderen C-Programm, daher verschwindet die Startverzögerung von 2 Sekunden.

Addendum 1: Seit November 2013 hat die Entwicklungsversion von Julia keine Startverzögerung von 2 Sekunden mehr, da die Standardbibliothek als Binärcode vorkompiliert wird. Die Startzeit ist immer noch 10x langsamer als Python und Ruby, also gibt es Raum für Verbesserungen, aber es ist ziemlich schnell. Der nächste Schritt wird sein, Precompilation von Paketen und Skripten zu ermöglichen, damit diese genauso schnell starten können wie Julia selbst.

Addendum 2: Seit Juni 2015 kompiliert die Entwicklungsversion von Julia automatisch viele Pakete, so dass sie schnell geladen werden können. Der nächste Schritt ist die statische Kompilierung von ganzen Julia-Programmen.

+6

Ich habe eine Reihe von Kommentaren aus dem letzten Jahr im Web gesehen, die darauf hinweisen, dass kompilierte ausführbare Dateien/geteilte Objekte das Ziel für Julia sind, aber keine Hinweise auf Fortschritte. Können Sie einen Einblick geben, wo die Dinge stehen? – dfreeman

+2

Jameson Nash und Isaiah Norton haben eine Menge Fortschritte gemacht, aber es ist noch nicht ganz da. – StefanKarpinski

+23

Diese Funktionalität ist jetzt abgeschlossen und auf Julia-Master zusammengeführt. Anstatt ~ 1,5 Sekunden auf meinem System zu nehmen, um Julia zu starten, dauert es jetzt ~ 150 Millisekunden - eine beeindruckende 10-fache Beschleunigung. Wenn es uns gelingt, eine weitere 10-fache Beschleunigung zu erreichen, was durchaus möglich ist, wird Julias Startzeit mit Ruby und Python vergleichbar sein. – StefanKarpinski

Verwandte Themen