Miri でのプロファイリング方法について。

背景

Miri での実行は非常に遅い。通常実行の 1 万倍以上かかる場合もある (1 秒が 2 時間以上)。原因は UB の有無の確認、インタプリタ形式での実行、両者の掛け算にあると思われる。

これを少しでも速くしたい場合、まずはどこが遅いかの分析にプロファイラが必要だろう。

しかし、前述の通り Miri での実行はインタプリタ形式である。そのため、ネイティブ実行のためのプロファイラ (例: samply) ではインタプリタ側の実行情報しかとれない。

対策として、Miri での実行では自己プロファイリングを行えるようになっている。

実行方法

以下の手順でプロファイリングできる。

  1. 環境変数 MIRIFLAGS-Zmiri-measureme=dir_name を設定。

    ここで dir_name は結果ファイルの出力先ディレクトリ名である。

  2. Miri で対象のプログラムを実行。

    なお、結果ファイルは実行文脈ごとに複数が生成される場合がある (例: 単体テストと結合テストを含むテストの実行時)。とはいえ、どれが目的のファイルかはその名称からいくらか予想できるようになっている。

  3. 結果ファイルを各種ビューアで表示。

    各種ビューアは measureme の紹介ページに掲載されている。例えば、SVG でインタラクティブなフレームグラフを表示する flamegraph や Web ブラウザ Chrome の開発者ツールを流用する crox などがある。

flamegraph

flamegraph の導入と使用のためのコマンド一覧。

インストール

cargo install --git https://github.com/rust-lang/measureme --branch stable flamegraph
SVG への変換

flamegraph dir_name/file_name.mm_profdata

これにより rustc.svg ファイルが出力される。