Skip to content

Instantly share code, notes, and snippets.

@ujimushi
Created May 31, 2023 13:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ujimushi/225c4d5d3b1a274d427ffce04260d69c to your computer and use it in GitHub Desktop.
Save ujimushi/225c4d5d3b1a274d427ffce04260d69c to your computer and use it in GitHub Desktop.
Blink.jl + Interact.jl の起動時間をJulia1.9 + PrecompileTools.jlhで改善する例
#=
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)
@ujimushi
Copy link
Author

改善前

julia> using UjiDemoJulia; UjiDemoJulia.julia_main()
[ Info: Listening on: 127.0.0.1:2880, thread id: 1
 12.402139 seconds (16.24 M allocations: 1.065 GiB, 2.75% gc time, 98.66% compilation time)

改善後

julia> using UjiDemoJulia19; UjiDemoJulia19.julia_main()
[ Info: Listening on: 127.0.0.1:8660, thread id: 1
  0.781186 seconds (542.54 k allocations: 39.801 MiB, 2.81% gc time, 79.94% compilation time: 35% of which was recompilation)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment