Emacs が何をしようとしているのかを知ることができるように を設定debug-on-quit
するという提案は良いものです。t
これは、1 つのサンプルを使用したサンプリング プロファイリングの形式と考えることができます。多くの場合、必要なのは 1 つのサンプルだけです。
更新:バージョン 24.3 以降、Emacs には2 つのプロファイラーが含まれています。には (新しい) サンプリング プロファイラーがprofiler.el
あり、 には (古い) 計測プロファイラーがありelp.el
ます。
サンプリング プロファイラーについては、こちらに記載されています。使い方はとても簡単です:
プロファイリングを開始するには、 と入力しM-x profiler-start
ます。プロセッサ使用率、メモリ使用率、またはその両方でプロファイリングすることを選択できます。いくつかの作業を行った後、入力M-x profiler-report
して、プロファイリングすることを選択した各リソースの要約バッファーを表示します。プロファイリングが終了したら、 と入力しM-x profiler-stop
ます。
これは、私が維持しているPerforce/Emacs 統合cpu+mem
を使用したプロファイラー セッションからの出力例です。CPU 時間とメモリ使用量がどこから来ているかを調べるために、一番上の関数 () を展開しました。progn
Function Bytes %
- progn 26,715,850 29%
- let 26,715,850 29%
- while 26,715,850 29%
- let 26,715,850 29%
- cond 26,715,850 29%
- insert 26,715,850 29%
+ c-after-change 26,713,770 29%
+ p4-file-revision-annotate-links 2,080 0%
+ let 20,431,797 22%
+ call-interactively 12,767,261 14%
+ save-current-buffer 10,005,836 11%
+ while 8,337,166 9%
+ p4-annotate-internal 5,964,974 6%
+ p4-annotate 2,821,034 3%
+ let* 2,089,810 2%
原因は であることがわかります。したがって、このコードの周りにローカルにバインドすることc-after-change
で、CPU 時間とメモリを大幅に節約できるように見えます。inhibit-modification-hooks
t
Emacs Lisp Profiler を使用することもできます。詳細についてはコメントを読む必要がありますがelp.el
、基本的にはelp-instrument-package
、特定のプレフィックスを持つすべての関数のプロファイリングを有効にしてelp-results
から、結果を確認するために実行します。
M-x elp-instrument-package RET c- RET
と入力し、4,000 行の C をフォント化してから実行したelp-results
(およびelp-sort-by-function
呼び出しカウントでソートするために使用した)後の典型的な出力を次に示します。
Function Name Call Count Elapsed Time Average Time
============================= ========== ============ ============
c-skip-comments-and-strings 107 0.0 0.0
c-valid-offset 78 0.0 0.0
c-set-offset 68 0.031 0.0004558823
c-end-of-macro 52 0.0 0.0
c-neutralize-CPP-line 52 0.0 0.0
c-font-lock-invalid-string 20 0.0 0.0
c-set-style-1 19 0.031 0.0016315789
...
特定のケースでは、どのパッケージに問題があるかわからないため、プロファイラーはすぐには役に立ちません。しかし、推測できる (またはdebug-on-quit
確実に見つけるために使用する) ことができれば、プロファイラーは問題を詳細に診断するのに役立ちます。