いろいろなプロファイラ。
あんま日本語情報無いものも多いので適当に要点だけまとめて書いてみます。
gprof
使いかたは割と常識的チックな。 -pg つけて実行すると gmon.out ができるので gprof ./a.out とかするとなんか出る。 gprof -l -A -x とかでアノテートとか。
原理は GCC が関数呼び出しにフックかけてて mcount が呼ばれている。 -finstrument-functions とかで自分でも作れます。
タイマも使っていると教えていただきました。時間測定はタイマ使ったサンプリングベース。関数の出入りは mcount で厳密に。
sysprof
kernel-2.6.11 以降を CONFIG_PROFILING オプションつきでコンパイル。後は sysprof で gtk+ のインターフェイスが出てくるのでもうサルでもわかって超手軽。システム全体のプロファイルが取れる。
この手のプロファイラ使ったこと無い人はスクリーンショットを見ると感動できそう。というか私が感動した。パフォーマンスはあんま落ちないと思う。
kernel モジュールでは一定時間おきに現在プロセスのスタックトレースを取得して /proc/sysprof-trace に吐く。クライアントはこれを見る。そんだけ。手軽。 /proc/sysprof-trace のフォーマットも超簡単。
OProfile
Linux 。色んなアーキテクチャに対応。但し CPU によっては性能を全部発揮できない。ノートPCだと残念な場合も。
これも kernel モジュール & クライアントユーティリティ。というか sysprof よりかなり古い。(参考: sysprofアナウンスへのoprofileでいいじゃんというコメントへの反論)
なんかもう色々できる。
% opcontrol --vmlinux=/usr/src/linux-2.6.15.4/vmlinux --callgraph=20 # 設定 % opcontrol --start # 動け % opcontrol --reset # カウンタのリセット % ./a.out # 実行 % opcontrol --dump # 結果をファイルに保存 % opreport # 結果見る % opreport -c # コールグラフ見る % opannotate -a -s # ソースつきで見る % opcontrol --stop # 止める % opcontrol --shutdown # プロセスも止める
とかがよくありそうなストーリー。
google-perftools やら sysprof みたいなタイマーベースの実装以外にも、なんか CPU のプロファイル情報を使う。よって対応している CPU では出鱈目に多くのサンプル数を拾ってくれる。
あと、対応してる CPU だと opcontrol --event で拾うイベントを選択できる。L2キャッシュミスだけをカウントしたりできるのです。
/dev/oprofile に oprofilefs とかいうファイルシステムでマウント。なんか独自のプロファイラをここ見て作るのも面白そうなんだけど…