使用PackageCompiler.jl加快Julia的启动

通过转到Julia编程语言的官方网站,您可以看到以下语句:“ Julia很快!”。 然而,实际上,新用户面临模块,特别是图形模块[ 1,2 ]加载缓慢的问题。 辩证地说,启动缓慢的原因是使用JIT编译,而JIT编译的使用确保了较高的语言性能。 如果需要,可以在其他文章中找到JIT的功能。 本文将讨论一个更实际的任务-如何使用PackageCompiler.jl在Julia中加速模块的启动。


本文使用julia v1.1.0 。 此外,该方法已在julia v1.0.3上进行了测试。
为了评估运行时,使用了一个简单的脚本:


@time using Plots x = 0:0.01:10000 y = @. sin(π*x) @time plot(x,y) # ,   @time plot(x,y) # ,   

通过在stock julia上运行此脚本,可以获得以下值:


  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) 

如您所见, plot命令的第一次执行持续了令人难以置信的14秒。 跟随他已经是0.01 s。


让我们尝试改善这些指标。 首先,安装PackageCompiler模块:


 import Pkg Pkg.add("PackageCompiler") 

接下来,测试“ Plots模块的依赖关系构建:


 import Pkg Pkg.add("Arpack") Pkg.build("Arpack") 

如果最后一条命令的执行因错误而中断
ERROR: LoadError: LibraryProduct(...) is not satisfied, cannot generate deps.jl!
,然后您成为第5期的受害者。 该问题与外部动态库的使用有关,并且必须在BinaryProvider集成之后解决。 作为临时解决方案, 根据blegat的建议 ,我们将自行组装该


 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/ 

执行这些操作后,该错误应消失:


 import Pkg Pkg.build("Arpack") 

现在该编译Plots程序包了:


 import Pkg Pkg.add("Plots") using PackageCompiler compile_package("Plots") 

编译会持续很长时间,并且控制台中会包含很多文本。 注意日志的最后一行:


 ┌ 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" 

它指示已编译图像的位置并提示如何启动它。
使用以下图像运行测试脚本:


 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) 

因此,首次启动plot功能的时间从14 s减少到0.03 s。


此方法可用于导出多个库的映像,修改系统映像以及编译静态程序。 要了解有关PackageCompiler.jl的更多信息,请参考项目存储库中的描述。

Source: https://habr.com/ru/post/zh-CN451068/


All Articles