分析行为exceptionEmacs Lisp的提示?

我定制了很多Emacs。 最近,我添加了一些东西到我的.emacsconfiguration零星挂钩我的CPU在100%,但我真的不知道它是什么。

如果我按了一堆Cg,最终我会在小缓冲区下面得到一个消息,询问我是否要自动保存我的文件,然后如果我想完全中止emacs。 如果我一直说不,并保持按下Cg,最终我可以恢复正常运行emacs。 一个小时左右,它会再次发生。

我可以继续像我一样,评论我最近添加的各种东西,重新启动emacs,试图缩小罪魁祸首,但这是慢的。

有没有一种方法可以直接查看emacs来找出哪些lisp函数占用CPU?

debug-on-quit设置为t的build议,以便您能够找出Emacs所要做的是一件好事。 你可以把它看作是一个采样分析的一种forms,通常只需要一个样本。


更新:从版本24.3开始,Emacs包含两个分析器。 profiler.el中有一个(新)采样分析器,以及elp.el一个(旧)instrumenting分析器。

采样分析器logging在这里 。 这是非常简单的使用:

要开始分析,请键入Mx profiler-start 。 您可以select按处理器使用情况,内存使用情况或两者进行configuration。 完成一些工作之后,inputMx profiler-report ,为您selectconfiguration的每个资源显示摘要缓冲区。 完成分析后,键入Mx profiler-stop

以下是我使用Perforce / Emacs集成进行cpu+mem分析器会话的一些输出示例。 我已经扩展了最高层function( progn ),以便找出CPU时间和内存使用来自何处 。

 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 ,所以看起来好像我可以通过本地绑定inhibit-modification-hooks来节省大量的CPU时间和内存。


您也可以使用Emacs Lisp Profiler。 这是相当不足的文件:你将不得不阅读在elp.el的意见的细节,但基本上你运行elp-instrument-package打开所有function的分析与给定的前缀,然后elp-results看结果。

在inputMx elp-instrument-package RET c- RET ,input4,000行C,然后运行elp-results (并使用elp-sort-by-function按呼叫计数sorting),这里有一些典型的输出:

 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来确定),那么分析器可以帮助您详细诊断问题。

你尝试过: Options->Enter debugger on Quit/Cg ? (这是在emacs22)

如果您需要debuggingemacs的启动:使用emacs -q --no-site-file ,访问您的.emacs (或site-start.el或其他),激活菜单项Options->Enter debugger on Quit/Cg ,然后菜单项Emacs-Lisp->Evaluate bufferEmacs-Lisp->Evaluate bufferCg出现冻结时Emacs-Lisp->Evaluate buffer 。 可能有一个更简单的方法来做到这一点………

通过dope.el,您可以configuration整个.emacs或启动时加载的多个elisp文件。 从www.gnufans.net/~deego/pub/emacspub/lisp-mine/dope/下载

Mx dope-quick-start会显示一些介绍教程。

编辑:原来的URL现在已经不存在,但在Git Hub上有一个工作镜像:
https://raw.github.com/emacsmirror/dope/master/dope.el

严格来说,这不是严格意义上的答案,而不是做出注释掉和重新开始的事情,你可以用-q选项启动emacs,把你的.emacs加载到一个缓冲区中,然后自己评估每个sexpr Cx Ce追查违规者。