Auf der offiziellen Website der Programmiersprache Julia können Sie die Aussage "Julia ist schnell!" Sehen. In der Praxis sind neue Benutzer jedoch mit dem Problem des langsamen Ladens von Modulen konfrontiert, insbesondere von grafischen [ 1 , 2 ]. Dialektisch ist der Grund für den langsamen Start die Verwendung der JIT- Kompilierung, deren Verwendung eine hohe Sprachleistung gewährleistet. Falls gewünscht, finden Sie die Funktionen von JIT in anderen Artikeln . In diesem Artikel wird eine praktischere Aufgabe erläutert - wie Sie den Start von Modulen in Julia mithilfe von PackageCompiler.jl beschleunigen können .
Dieser Artikel verwendet Julia v1.1.0 . Zusätzlich wurde die Methode auf Julia v1.0.3 getestet.
Zur Auswertung der Laufzeit wurde ein triviales Skript verwendet:
@time using Plots x = 0:0.01:10000 y = @. sin(π*x) @time plot(x,y)
Durch Ausführen dieses Skripts auf Stock Julia werden die folgenden Werte erhalten:
2.804964 seconds (5.03 M allocations:x 291.243 MiB, 5.35% gc time) 13.546407 seconds (45.64 M allocations: 2.232 GiB, 9.00% gc time) 0.013167 seconds (2.14 k allocations: 7.788 MiB)
Wie Sie sehen können, dauert die erste Ausführung des Plotbefehls unglaubliche 14 Sekunden. Ihm zu folgen ist schon 0,01 s.
Versuchen wir, diese Indikatoren zu verbessern. Installieren Sie zunächst das PackageCompiler-Modul:
import Pkg Pkg.add("PackageCompiler")
Testen Sie als Nächstes den Abhängigkeitsaufbau des Plots
Moduls:
import Pkg Pkg.add("Arpack") Pkg.build("Arpack")
Wenn die Ausführung des letzten Befehls mit einem Fehler unterbrochen wurde
ERROR: LoadError: LibraryProduct(...) is not satisfied, cannot generate deps.jl!
Dann wurden Sie Opfer von Problem Nr. 5 . Das Problem hängt mit der Verwendung externer dynamischer Bibliotheken zusammen und muss nach der Integration von BinaryProvider behoben werden . Als vorübergehende Lösung werden wir auf Anraten von blegat die Bibliothek selbst zusammenstellen:
git clone https://github.com/opencollab/arpack-ng.git /tmp/arpack && cd /tmp/arpack git checkout 3.5.0 bash bootstrap ./configure --enable-mpi --enable-shared make cp SRC/.libs/libarpack.so.2.0.0 ~/.julia/packages/Arpack/UiiMc/deps/usr/lib/
Nach diesen Manipulationen sollte der Fehler verschwinden:
import Pkg Pkg.build("Arpack")
Es ist Zeit, das Plots
Paket zu kompilieren:
import Pkg Pkg.add("Plots") using PackageCompiler compile_package("Plots")
Die Kompilierung dauert lange genug mit viel Text in der Konsole. Achten Sie auf die letzte Zeile des Protokolls:
┌ Info: Not replacing system image. └ You can start julia with `julia -J /home/user/.julia/packages/PackageCompiler/oT98U/sysimg/sys.so` at a posix shell to load the compiled files. "/home/user/.julia/packages/PackageCompiler/oT98U/sysimg/sys.so"
Es gibt den Speicherort des kompilierten Bildes und einen Hinweis zum Starten an.
Führen Sie das Testskript mit diesem Bild aus:
julia -J /home/user/.julia/packages/PackageCompiler/oT98U/sysimg/sys.so /tmp/test.jl
0.000251 seconds (501 allocations: 26.766 KiB) 0.028105 seconds (22.55 k allocations: 8.847 MiB) 0.017211 seconds (2.14 k allocations: 7.788 MiB, 18.16% gc time)
Somit wurde die Zeit des ersten Starts der plot
von 14 s auf 0,03 s reduziert.
Mit dieser Methode können Bilder mehrerer Bibliotheken exportiert, das Systemabbild geändert und statische Programme kompiliert werden. Weitere Informationen zu PackageCompiler.jl finden Sie in der Beschreibung im Projekt-Repository .