byte-recompile-directory需要很长时间才能运行

时间:2015-01-13 17:08:01

标签: emacs gnu

我希望安装emacs安装免受系统范围的插件的影响。 Gentoo直接在 lisp 目录中安装它们。所以我在家里创建了单独的 emacs / lisp 目录,其中只包含来自emacs本身的文件。每次我跑,他们都被编译。所以我想减少运行时间并预编译这些文件。

我使用C-u 0 M-x byte-recompile-directory来生成字节编译的文件。我有GNU Emacs 24.4.1

首先,我尝试按字节重新编译子目录' lisp / calc'有44个文件,总大小为2 Mb。 Emacs需要大约15分钟的连续工作,100%的CPU负载才能对字节进行字节重新编译。我以为emacs已经卡在了某个地方,但是当我等待的时间更长时,它成功地完成了任务。

现在我尝试按字节重新编译整个' lisp'目录。该过程仍然在单线程中加载我的i5处理器100%。顶级实用程序显示它已经消耗了超过38小时的纯cpu时间。

字节重新编译的目录花费这么多时间处理目录是否正常?可能由我特定版本的软件引起的异常?有人必须在分发之前打包emacs,他是否花了很多时间进行编译或者拿出一些技巧?


更新我。

我没有为编译器文件执行单独的编译。只需运行单个命令


更新II。

我已经尝试过批处理字节重新编译目录,它的工作速度和我现代编译器所期望的一样快。编译器不到一分钟。没有批处理,编译过程需要超过10分钟。考虑到小型和大型目录的工作时间,我提出了一个' byte-recompile-directory'根据源大小,具有正方形或更多时间复杂度。由于建造者采用了一些奇怪的逻辑,大部分时间都被浪费了。可能是在迭代过程中多次访问了一些文件。


更新III

由于@phils建议问题出在emacs初始化文件中。首先,我认为案例是在尝试编译emacs用于运行的lisp文件。所以我创建了简单的start.el文件,将load-path变量重置为lisp目录的新副本。但事实并非如此。即使使用目标文件来运行emacs也能很好地完成它的工作。

这就是一些与编译工作混淆的插件。

1 个答案:

答案 0 :(得分:1)

字节编译非常快。如果重新编译目录花费的时间超过几秒钟,则有些不对劲。 (例如,如果我强制字节编译calc目录的副本,则只需不到10秒。)

如果你想尽可能多地消除正在运行的Emacs实例的影响,那么从shell开始执行批量elisp字节编译的一个简单方法,批量运行带有-Q参数的Emacs模式,并调用batch-byte-recompile-directory函数。

e.g。以下任一shell命令都将重新编译当前工作目录中的文件(第二个版本将可选ARG传递给byte-recompile-directory)。

emacs -Q -batch -f batch-byte-recompile-directory

emacs -Q -batch -eval '(batch-byte-recompile-directory 0)'

您还可以在shell命令中附加目录参数列表,以重新编译这些目录:

emacs -Q -batch -f batch-byte-recompile-directory ~/.emacs.d/lisp ~/.emacs.d/elpa/haskell-mode-13.7

类似于编译单个文件列表的batch-byte-compile

emacs -Q -batch -f batch-byte-compile *.el

如有必要,您可以使用-L将目录添加到加载路径:

emacs -Q -L ~/.emacs.d/elpa/haskell-mode-13.7 -batch -f batch-byte-recompile-directory ~/.emacs.d/elpa/haskell-mode-13.7

emacs -Q -L . -batch -f batch-byte-recompile-directory

emacs -Q -L . -batch -f batch-byte-compile *.el

或者您可能希望首先初始化包系统:

emacs -Q -batch -f package-initialize -f batch-byte-recompile-directory ~/.emacs.d/elpa/haskell-mode-13.7

你明白了。

请注意,如果这样可以提高性能,则很可能是因为-Q参数(而不是与批处理模式下运行Emacs有关),在这种情况下,您应该调查您的site-lisp和/或问题原因的个人配置。