今回は、関数の実行速度を改善したい時に使える@profviewを紹介します。これを使うと、どこの関数の実行速度で問題になっているか調べることができて結構便利です。
前提として、関数の実行速度に不満がある、もっと速くしたいなどに使えます。
VScodeに紐づいたjuliaを開く。
まずはVSCodeで紐づいているjuliaを開きます。手順は以下の通りです。
shift + command + p
でjuliaを開いて、以下の画面を通じて、juliaを起動します(以下の画面のStart REPLをクリック)。
@profviewを使ってみよう。
そうして開いたターミナルで、@profview 関数名で調べてみよう
(なお、VSCodeで使いたい人向けのパッケージもあるみたいだが、ターミナルの方を推奨します。
https://github.com/kimikage/ProfileSVG.jl)
具体的な実行例
ここでは、複数の関数からなるmain()というものについて適用する。
@profview main()
実行結果はこんな感じとなる。
main関数より下が実際にコントロール可能な関数群となる。下の図の左側の画面の長方形の横幅が大きいほど時間がかかっているということになる。ここでは、solve関数がボトルネックになっているとわかる。そこで、Command +クリック
で該当するコードの箇所における(図を参照)
さらにupdate関数という関数に薄く青色の背景がついている。これは、型推論が成功しているけど、単純に時間がかかってますよ!
という意味である。
次に、update関数をクリックすると、
右側を見ると、inserglobalpivotに時間がかかっていそうだとわかる。詳細は以下のようである
赤い背景は、ループ内でランタイムディスパッチが起きている。
今回は、for文の中でerrという関数がfor文の中で作られているので、型不安定を引き起こしているようであった。
for文の中の外に出すかerrという関数を作らずに、optfirstpivotの中にerrを入れて直接誤差を計算する関数を作るという二つの解決策が考えられそうだ。
まとめ
以上のような感じで、関数の実行速度のボトルネックを発見、解決していくことができる。