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

byte-recompile-directory takes extremely long time to run

我想要一个没有安装系统范围插件的 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' 目录进行字节重新编译。该过程仍在单线程中以 100% 的速度加载我的 i5 处理器。 top 实用程序显示它已经消耗了超过 38 小时的纯 cpu 时间。

一个byte-recompiled-directory需要那么多时间来处理一个目录正常吗?会不会是我的软件版本问题导致的?有人必须在发布前打包emacs,他是花那么多时间编译还是袖手旁观?


更新一.

我没有对编译器文件进行单独编译。只需 运行 个命令


更新二.

我试过 batch-byte-recompile-directory,它的运行速度与我对现代编译器的预期一样快。编译器只需要不到一分钟的时间。并且没有批处理编译过程长达10多分钟。考虑到小型和大型目录的工作时间,我建议 'byte-recompile-directory' 根据源大小具有平方或更多的时间复杂度。由于构建器采用了一些奇怪的逻辑,大部分时间都被浪费了。可能是某些文件在迭代过程中被多次访问。


更新三

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

所以这是一些干扰编译器工作的插件。

字节编译非常快。如果重新编译目录所花的时间超过几秒钟,则说明有问题。 (例如,如果我强制字节编译 calc 目录的副本,它只需要不到 10 秒。)

如果您想尽可能多地消除来自 运行 Emacs 实例的影响,批量 elisp 字节编译的基本方法是从 shell、运行 Emacs 在批处理模式下使用 -Q 参数,并调用 batch-byte-recompile-directory 函数。

例如以下任一 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 and/or 问题原因的个人配置。