Acessando o site oficial da linguagem de programação Julia , você pode ver a declaração: "Julia is fast!". No entanto, na prática, novos usuários são confrontados com o problema do carregamento lento de módulos, especialmente os gráficos [ 1 , 2 ]. Dialeticamente, o motivo do início lento é o uso da compilação JIT , cujo uso garante alto desempenho do idioma. Se desejado, os recursos do JIT podem ser encontrados em outros artigos . Este artigo discutirá uma tarefa mais prática - como acelerar o lançamento de módulos na Julia usando o PackageCompiler.jl .
Este artigo usa julia v1.1.0 . Além disso, o método foi testado na julia v1.0.3 .
Para avaliar o tempo de execução, um script trivial foi usado:
@time using Plots x = 0:0.01:10000 y = @. sin(π*x) @time plot(x,y)
Executando este script no estoque julia, os seguintes valores são obtidos:
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)
Como você pode ver, a primeira execução do comando plot
dura incríveis 14 segundos. Segui-lo já é de 0,01 s.
Vamos tentar melhorar esses indicadores. Para começar, instale o módulo PackageCompiler:
import Pkg Pkg.add("PackageCompiler")
Em seguida, teste a construção de dependência do módulo Plots
:
import Pkg Pkg.add("Arpack") Pkg.build("Arpack")
Se a execução do último comando foi interrompida com um erro
ERROR: LoadError: LibraryProduct(...) is not satisfied, cannot generate deps.jl!
, você se tornou vítima da edição 5 . O problema está associado ao uso de bibliotecas dinâmicas externas e terá que ser resolvido após a integração do BinaryProvider . Como solução temporária, a conselho da blegat , montaremos a biblioteca :
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/
Depois de executar essas manipulações, o erro deve desaparecer:
import Pkg Pkg.build("Arpack")
É hora de compilar o pacote Plots
:
import Pkg Pkg.add("Plots") using PackageCompiler compile_package("Plots")
A compilação dura o suficiente com muito texto no console. Preste atenção na última linha do log:
┌ 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"
Indica a localização da imagem compilada e uma dica sobre como iniciá-la.
Execute o script de teste usando esta imagem:
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)
Assim, o tempo do primeiro início da função plot
foi reduzido de 14 para 0,03 s.
Este método pode ser usado para exportar imagens de várias bibliotecas, modificar a imagem do sistema e compilar programas estáticos. Para saber mais sobre o PackageCompiler.jl, consulte a descrição no repositório do projeto .