Profile

[email protected] ── マクロ
@profile

@profile <expression> は一定の周期でバックトレースを取得しながら式を実行します。取得されたバックトレースは内部にあるバッファに追加されます。

これ以降のメソッドはエクスポートされないので、Profile.print() などとして呼び出す必要があります。

Profile.clear ── 関数
clear()

内部バッファに含まれるバックトレースを全て削除します。

Profile.print ── 関数
print([io::IO = stdout,] [data::Vector]; kwargs...)

性能測定の結果を io に出力します。io のデフォルト値は stdout です。ベクトル data を渡さないと、内部バッファに積まれたバックトレースが使われます。

キーワード引数には次のキーワードの任意の組み合わせを指定できます:

  • format: バックトレースの出力に木構造を表すインデントを付けるか (:tree) 付けないか (:flat) を指定します。デフォルトは :tree です。

  • C: true だと、C と Fortran コードからのバックトレースが表示されます。デフォルトは false です。

  • combine: true (デフォルト) だと、コードの同じ行に対応する命令ポインタがマージされます。

  • maxdepth: :tree 形式の出力におけるインデントの深さを制限します。

  • sortedby: :flat 形式の出力における順序を制御します。:filefuncline (デフォルト) にすると関数が定義されたソースファイルと行番号でソートされ、:count にすると収集されたバックトレースに考えている関数が含まれる回数でソートされ、:overhead にすると収集されたバックトレースの底に考えている関数が含まれる回数でソートされます。

  • noisefloor: 考えている行のサンプル数を n, その行を呼び出した関数のサンプル数を N としたときに、n <= noisefloor * √N が成り立つサンプルを出力しません (:tree 形式のときにだけ意味を持ちます)。ヒューリスティックで計算されるサンプルノイズの上限を超えるフレームだけを出力するということです。デフォルトは 0 であり、最初に試す値として 2.0 が提案されます。

  • mincount: mincount 回以上現れた行だけを出力します。

  • recur: :tree 形式における再帰の扱いを制御します。:off (デフォルト) だと木は通常通りに出力されます。:flat だと再帰が圧縮されて出力され、自分自身を呼び出す部分が一つにまとめられます。:flatc:flat と同じですが、加えて C フレームを崩して表示します (jl_apply の周りに様々な関数が表示されます)。

print([io::IO = stdout,] data::Vector, lidict::LineInfoDict; kwargs...)

性能計測の結果を io に出力します。このバージョンは retrieve で出力された結果を調べるのに使われます。ベクトル data にバックトレースを、辞書 lidict に行番号の情報を渡してください。

キーワード引数の説明は Profile.print([io], data) を見てください。

Profile.init ── 関数
init(; n::Integer, delay::Real))

バックトレースを取得する間隔を delay 秒に、記録される命令ポインタの個数を最大 n 個に設定します。一つの命令ポインタは一行のコードに対応し、通常バックトレースは命令ポインタの長いリストで構成されます。デフォルトの設定は引数を付けずにこの関数を呼ぶと取得できます。設定するにはキーワード引数として個別に値を渡すか、(n, delay) という順番で位置引数として値を渡してください。

Profile.fetch ── 関数
fetch() -> data

測定結果が記録されるバックトレースのバッファのコピーを返します。data は現在のマシンの現在のセッションでだけ意味を持つことに注意してください。これは data が JIT コンパイルで使われる正確なメモリアドレスを必要とするためです。この関数は主に内部で使われるためにあります: ほとんどのユーザーは retrieve を使うべきです。

Profile.retrieve ── 関数
retrieve() -> data, lidict

測定結果をポータブルなフォーマットで “エクスポート” します。全てのバックトレースを含む data と、data に含まれる命令ポインタをファイル名・関数名・行番号を表す LineInfo に対応付ける辞書 lidict を返します。この関数を使うと性能計測の結果を保存して以降の解析で利用できるようになります。

Profile.callers ── 関数
callers(funcname,
        [data,
        lidict],
        [filename=<filename>],
        [linerange=<start:stop>]) -> Vector{Tuple{count, lineinfo}}

以前の性能計測結果を受け取り、特定の関数を呼び出した関数を返します。ファイル名 (および関数が定義された行番号の範囲) を指定することでオーバーロードされたメソッドの曖昧性を取り除くことができます。返り値は呼び出し側の呼び出し回数と行番号情報を要素とするベクトルです。省略可能引数 data には retrieve で取得したバックトレースを取得でき、指定しなければ現在の内部バッファが使われます。

clear_malloc_data()

julia--track-allocation で起動したときに記録されるメモリアロケートのデータをクリアします。テストしたいコマンドを一度実行し (JIT コンパイルを行わせて) から clear_malloc_data を呼び出し、それからコマンドをもう一度実行し、Julia を終了し、生成された *.mem ファイルを調べるという手順を踏んでください。