我经常自定义Emacs.最近,我在我的.emacs配置中添加了一些内容,偶尔会将我的CPU固定在100%,但我真的不知道它是什么.
如果我多次按下Cg,最终我会在迷你缓冲区下方收到一条消息,询问我是否要自动保存我的文件,然后如果我想完全中止emacs.如果我一直拒绝并按下Cg,最终我可以恢复正常运行emacs.大约一个小时后它会再次发生.
我可以继续像我一样,评论我最近添加的各种内容,重新启动emacs,试图缩小罪魁祸首,但它进展缓慢.
有没有办法可以直接分析emacs来找出什么lisp函数占用CPU?
设置的建议是debug-on-quit
为了t
让您了解Emacs的最佳状态.您可以将此视为采用单个样本的采样分析形式:通常只需要一个样本即可.
更新:从版本24.3开始,Emacs包含两个分析器.有一个(新的)采样分析器profiler.el
和一个(旧的)仪器分析器elp.el
.
此处记录了采样分析器.它非常简单易用:
要开始分析,请键入
M-x profiler-start
.您可以选择按处理器使用情况,内存使用情况或两者进行配置.完成M-x profiler-report
某项工作后,键入以显示您选择配置的每个资源的摘要缓冲区.完成分析后,键入M-x profiler-stop
.
以下是我维护cpu+mem
的Perforce/Emacs集成的探查器会话的一些示例输出.我已经扩展了最顶层的函数(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
到t
这个代码来节省大量的CPU时间和内存.
您也可以使用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
用于确定它),那么探查器可以帮助您详细诊断问题.
你试过了Options->Enter debugger on Quit/C-g
吗?(这是在emacs22上)
如果您需要调试emacs的启动:使用emacs -q --no-site-file
,访问您的.emacs
(site-start.el
或其他),激活菜单项Options->Enter debugger on Quit/C-g
,然后菜单项Emacs-Lisp->Evaluate buffer
以及C-g
它何时冻结.这可能是一种更简单的方法.........
使用dope.el,您可以分析启动时加载的整个.emacs或多个elisp文件.从www.gnufans.net/~dego/pub/emacspub/lisp-mine/dope/下载
M-x dope-quick-start
将展示一个小介绍教程.
编辑:原始URL现已不存在,但Git Hub上有一个工作镜像:https:
//raw.github.com/emacsmirror/dope/master/dope.el
严格来说,这不是你问题的答案,但是你可以使用该-q
选项启动emacs,将你的.emacs加载到缓冲区并使用Cx Ce自己评估每个sexpr ,而不是执行注释 - 重新启动的事情.追查违规者.