Previous: , Up: Lispプログラムのデバッグ   [Contents][Index]


19.5 プロファイリング

プログラムは正常に機能しているものの、十分に高速ではないのでより高速かつ効率的に実行させたい場合には、そのプログラムが実行時間の大半をどこで消費しているか知るために、コードをプロファイル(profile)することが最初に行うべきことです。ある特定の関数の実行が実行時間のうちの無視できない割り合いを占めるようなら、その部分を最適化する方法を探すことを開始できます。

Emacsにはこのためのビルトインサポートがあります。プロファイリングを開始するにはM-x profiler-startをタイプします。CPU使用率の定期的なサンプリング(cpu、かメモリー割り当て時(memory)、またはその両方を選択できます。それから高速化したいコードを実行します。その後にM-x profiler-reportとタイプすると、プロファイルに選択した各タイプ(cpuとmemory)によりサンプリングされたCPU使用率がsummaryバッファーに表示されます。reportバッファーの名前にはレポートが生成された時刻が含まれるので、前の結果を消去せずに後で他のレポートを生成できます。プロファイリングが終了したらM-x profiler-stopとタイプしてください(プロファイリングに関連したオーバーヘッドが若干あるので実際に調査したいコードの実行中以外にアクティブのままに放置することは推奨しない)。

profiler reportバッファーでは、各行に呼び出された関数、その前にプロファイリングが開始されてから使用したCPUリソースの絶対時間とパーセンテージが表示されます。関数名の左にシンボル‘+’のある行ではRETをタイプして行を展開して高位レベルの関数に呼び出された関数を確認できます。関数ツリー配下全体の呼び出しを確認するにはプレフィクス引数を使用します(C-u RET)。もう一度RETをタイプすれば元の状態へと行が折り畳まれます。

jmouse-2を押下するとポイント位置の関数の定義にジャンプします。dを押下すると関数のドキュメントを閲覧できます。C-x C-wを使用してプロファイルをファイルに保存できます。=を使用すれば2つのプロファイルを比較することができます。

elpライブラリーはプロファイルしたいLisp関数が事前に解っているときに有用な別のアプローチを選択肢として提供します。このライブラリーの使用するには、まずelp-function-listに関数シンボルのリスト(プロファイルしたい関数)をセットします。それから関数をプロファイル用にアレンジするためにM-x elp-instrument-list RET nil RETとタイプします。プロファイルしたいコードの実行後にM-x elp-resultsを呼び出してカレント結果を表示します。処理手順の詳細についてはelp.elファイルを参照してください。このアプローチはLispで記述された関数のプロファイリングに限定されており、Emacsプリミティブのプロファイルはできません。

benchmarkライブラリーを使用して個々のEmacs Lispフォームの評価に消費される時間を計測できます。benchmark.el内の関数benchmark-call、同様にマクロbenchmark-runbenchmark-run-compiledbenchmark-prognbenchmark-callを参照してください。フォームをインタラクティブに時間計測するためにbenchmarkコマンドも使用できます。

configureのオプションに--enable-profilingを使用してビルドすることにより、EmacsをCコードのレベルでプロファイルすることができます。こうしてビルドされたEmacsは、Emacsをexitするときにgprofユーティリティを使用して検証できるファイルgmon.outを生成します。この機能は主にEmacsのデバッグに有用です。このEmacsは実行状態から上述のM-x profiler-…コマンドによりLispレベルで実際にストップします。