46

私はEmacsをたくさんカスタマイズしています。最近、CPUを100%で散発的にペグする何かを.emacs構成に追加しましたが、それが何であるかは本当にわかりません。

Cgを何度も押すと、最終的にミニバッファーの下に、ファイルを自動保存するかどうか、そしてemacsを完全に中止するかどうかを尋ねるメッセージが表示れます。いいえと言い続けてCgを押し続けると、最終的には通常どおりemacsの実行に戻ることができます。1時間かそこら後にそれは再び起こります。

最近追加したさまざまなことをコメントし、emacsを再起動し、犯人を絞り込もうとして、私は今のように続けることができましたが、それは遅いです。

emacsを直接プロファイリングして、どのlisp関数がCPUを占有しているかを把握する方法はありますか?

4

4 に答える 4

52

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-hookst


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確実に見つけるために使用する) ことができれば、プロファイラーは問題を詳細に診断するのに役立ちます。

于 2009-02-20T13:48:56.943 に答える
8

試しましたか:Options->Enter debugger on Quit/C-g?(これはemacs22にあります)

emacsの起動をデバッグする必要がある場合:を使用して、 (またはその他の)emacs -q --no-site-fileにアクセスし、メニュー項目をアクティブにしてから、メニュー項目をフリーズしたように見えるときにアクティブにします。これを行うためのより簡単な方法があるかもしれません........。.emacssite-start.elOptions->Enter debugger on Quit/C-gEmacs-Lisp->Evaluate bufferC-g

于 2009-02-20T03:41:29.787 に答える
6

dope.elを使用すると、起動時にロードされた.emacs全体または複数のelispファイルのプロファイルを作成できます。www.gnufans.net/~deego/pub/emacspub/lisp-mine/dope/からダウンロードしてください

M-x dope-quick-start少し紹介チュートリアルを表示します。

編集:元のURLは機能しなくなりましたが、Git Hubには機能するミラーがあります:
https ://raw.github.com/emacsmirror/dope/master/dope.el

于 2009-03-19T12:26:26.143 に答える
5

これは厳密に言えば、あなたの質問に対する答えではありませんが、コメントアウトして再開するのではなく、-qオプションでemacsを開始し、.emacsをバッファーにロードして、CxCeで各sexprを自分で評価できます。問題のあるものを追跡します。

于 2009-02-20T03:23:40.470 に答える