分析行为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 buffer
当Emacs-Lisp->Evaluate buffer
和Cg
出现冻结时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追查违规者。