Creating a sysimage for fast plotting with Plots.jl
A common complaint about Julia is that the "time to first plot" is a bit longer than desired. In this example, we will create a sysimage that is made to improve this.
To get a reference, we measure the time it takes to create the first plot with the default sysimage:
julia> @time using Plots
2.943946 seconds (8.11 M allocations: 567.656 MiB, 6.47% gc time)
julia> @time p = plot(rand(2,2));
1.940742 seconds (3.29 M allocations: 197.525 MiB, 4.65% gc time)
julia> @time display(p);
5.132217 seconds (15.00 M allocations: 847.491 MiB, 2.57% gc time, 45.95%)
This is approximately 19 seconds from the start of Julia to the first plot.
We now create a precompilation file with exactly this workload in a file called precompile_plots.jl
in the current directory:
using Plots
p = plot(rand(2,2))
display(p)
The custom sysimage is then created as:
using PackageCompiler
create_sysimage(["Plots"], sysimage_path="sys_plots.so", precompile_execution_file="precompile_plots.jl")
If we now start Julia with the flag --sysimage sys_plots.so
and re-time our previous commands:
julia> @time using Plots
0.000159 seconds (1.07 k allocations: 79.797 KiB)
julia> @time p = plot(rand(2,2));
0.037670 seconds (74.09 k allocations: 4.703 MiB)
julia> @time display(p);
0.331869 seconds (278.38 k allocations: 7.900 MiB)
which is a sizeable speedup.
Note that since we have more stuff in our sysimage, Julia is slightly slower to start (0.35 seconds on this machine):
# Default sysimage
➜ time julia -e ''
julia -e '' 0.06s user 0.06s system 130% cpu 0.088 total
# Custom sysimage
➜ time julia --sysimage sys_plots.so -e ''
julia --sysimage sys_plots.so -e '' 0.43s user 0.30s system 347% cpu 0.211 total