Blink.jl + Interact.jl の起動時間をJulia1.9 + PrecompileTools.jlhで改善する例
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#= | |
Blink.jl + Interact.jl の起動時間を | |
Julia 1.9(ネイティブキャッシュ) + PrecompileTools.jl で改善する例 | |
使い方: | |
書き込んでも構わないフォルダにこのソースをコピーし | |
replでこのソースがあるフォルダをカレントディレクトリにしてから | |
`include("ujidemo1_9.jl")` | |
で実行します。 | |
既存の環境に | |
`UjiDemoJulia`と `UjiDemoJulia19`のパッケージが追加されます(環境汚染します) | |
`using UjiDemoJulia; UjiDemoJulia.julia_main()` | |
で従来のコードが実行されます。 | |
`using UjiDemoJulia19; UjiDemoJulia19.julia_main()` | |
で一発目の起動を改善したコードが実行されます。 | |
一通り楽しんだ後は `]` でパッケージ管理モードに移って | |
rm UjiDemoJulia | |
rm UjiDemoJulia19 | |
を実行してモジュールを自分の環境から外しておいて下さい。 | |
更にゴミが気になる方は | |
`~/.julia/compiled/v1.9/UjiDemoJulia` | |
`~/.julia/compiled/v1.9/UjiDemoJulia19` | |
のフォルダ等を削除しておいて下さい。 | |
手持ちの環境ではreal_main()の一発目の実行時間(ウィンドウが表示されままでの時間)が | |
`約12秒 → 1秒未満`に改善されました。 | |
=# | |
using Pkg | |
old_demo = "UjiDemoJulia" | |
new_demo = "UjiDemoJulia19" | |
# プロジェクトを作成(従来版) | |
Pkg.generate(old_demo) | |
# 作成した従来版プロジェクトの環境に入ります | |
Pkg.activate(joinpath(".", old_demo)) | |
Pkg.add(["Blink", "Interact", "PlotlyJS"]) | |
# 元の環境に戻ります | |
Pkg.activate() | |
using_pkgs = """ | |
using Blink | |
using Interact | |
using PlotlyJS | |
""" | |
source_list = """ | |
function my_plot(f) | |
x = 0:0.001:1 | |
y = sin.((2*pi*f) .* x) | |
trace = [scatter(;x=x, y=y, mode="lines")] | |
layout = Layout( | |
;xaxis_range=[0.0, 1.0], | |
yaxis_range=[-1.2, 1.2], | |
x_axis_showgrid=true, yaxis_showgrid=true, | |
width=1000, height=600, | |
xaxis=attr(tickmode="linear", | |
tick0 = 0.0, dtick = 0.1), | |
yaxis=attr(tickmode="linear", | |
tick0 = 0.0, dtick = 0.2), | |
modebar_remove=["select2d", "lasso2d"]) | |
plot(trace, layout, config=PlotConfig(displaylogo=false)) | |
end | |
function real_main() | |
win = Window(Dict(:width => 1100, :height => 700, :defaultEncoding => "utf-8")) | |
f = slider(1:100; value=10, label="周波数") | |
plt = map(my_plot, f) | |
ui = vbox(f, plt) | |
body!(win, ui) | |
win | |
end | |
function julia_main()::Cint | |
@time win = real_main() | |
while Blink.AtomShell.active(win) | |
# sleep(1) # WindowsでCPU使用率が高くなる場合入れた方がいいかも… | |
yield() | |
end | |
return 0 | |
end | |
""" | |
# 追加するソースリストです。 | |
# real_main()関数の実行部分をネイティブキャッュに入れる試み | |
added_src_list = """ | |
@compile_workload begin | |
real_main() | |
end | |
""" | |
# ソースファイルを変更します | |
open(joinpath(old_demo, "src", "$(old_demo).jl"), "w") do src | |
lines = ["module $old_demo", using_pkgs, source_list, "end"] | |
for line in lines | |
println(src, line) | |
end | |
end | |
Pkg.develop(path=joinpath(".", old_demo)) | |
# 1.9 + Precompile | |
# プロジェクトを作成(改善版) | |
Pkg.generate(new_demo) | |
# 改善版プロジェクトの環境に移る | |
Pkg.activate(joinpath(".", new_demo)) | |
Pkg.add(["Blink", "Interact", "PlotlyJS"]) | |
# PrecompileToolsを追加 | |
Pkg.add("PrecompileTools") | |
# 元の環境に移る | |
Pkg.activate() | |
# 改善版のソースを書き換え | |
open(joinpath(new_demo, "src", "$(new_demo).jl"), "w") do src | |
lines = [ | |
"module $(new_demo)", | |
using_pkgs, "using PrecompileTools", # PrecompileToolsを追加 | |
source_list, added_src_list, # ネイティブキャッシュに入れます | |
"end" | |
] | |
for line in lines | |
println(src, line) | |
end | |
end | |
Pkg.develop(path=joinpath(".", new_demo)) | |
# 従来版のprecompile(動作時間に影響なし) | |
Pkg.precompile(old_demo) | |
# 改示版のをprecompile(一時的にWindowが表示されます) | |
Pkg.precompile(new_demo) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
改善前
改善後