プログラムをチューニングするには、 プロファイルを取るのが効果的である。 しかし、GNU Emacs Lisp Reference Manual では、 プロファイルの使い方が説明されていない。 そこでここでは、Emacs に標準である 2 つのプロファイラ、 profile と elp について説明する。
profile は、素朴なプロファイラである。 profile を利用するには、 自分でプロファイルをとる関数を 変数 profile-functions-list へ列挙する必要がある。
(require 'profile) (setq profile-functions-list '(next-line previous-line))
ここで profile-functions を実行すると、 それ以降実行された対象の関数に対しプロファイルが取られる。
M-x profile-functions
任意の時点で結果を表示するには、以下のコマンドを使う。
M-x profile-results
そうすると、*profile* というバッファが作成され、 以下のように表示される。
Function Calls Total time (sec) Avg time per call ============= ====== ================ ================= previous-line 2 0.000314 0.000157 next-line 2 0.000293 0.000147
残念ながら profile には、合計時間や平均時間で並べ替えて表示する機能はない。
再びプロファイルを取りたくなったり、 プロファイルする関数を増やしたくなったら、 以下のコマンドで一旦状態をクリアしてから、 この章で述べたことを最初からやり直す必要がある。
M-x profile-finish
profile を使うには、 どの関数が遅いかあたりを付けておく必要がある。 しかし、そもそもどの関数が遅いか調べたいからプロファイルを使いたいのだ。 だから、profile が役に立つ場面は少ない。
elp は、 あるパッケージで定義されている関数全部をプロファイルし、 結果を時間で並べ替えて表示する優れたプロファイラである。
elp を利用するには、 まず以下のコマンドを実行した後に、パッケージ名を入力する。
M-x elp-instrument-package
これで、そのパッケージで定義されている関数すべてがプロファイルの対象となる。 任意の時点で結果を表示するには、以下のコマンドを使う。
M-x elp-results
すると、 結果が "*ELP Profiling Results*" バッファに合計時間で並べ替られて表示される。 平均時間順に表示したいなら、以下のように設定しておけばよい。
(setq elp-sort-by-function 'elp-sort-by-average-time)
プロファイルを取り直したくなったら、 以下のコマンドで状態を初期化する。
M-x elp-reset-all