通过转到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)
通过在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的更多信息,请参考项目存储库中的描述。