构建最小的Emacs 25以进行单元测试


10

我想为Emacs Lisp软件包的单元测试构建一个非常小的Emacs干线变体。该构建不需要GUI,不需要图像等。本质上,它应该只是具有核心Emacs Lisp库的最小Emacs Lisp解释器,并且构建速度应该很快,最好在五分钟之内。

目前,我要传递--with-x-toolkit=no --without-x --without-all./configure。完成后,它告诉我所有Emacs功能都已禁用,但是不幸的是构建仍然需要近十分钟

我了解可能无法更快地构建Emacs,但是令我感到奇怪的是,使用相同的标志, Emacs 24.5可以在大约两分钟内构建。

这种巨大差异的原因是什么,我能否使Emacs干线的构建速度与Emacs 24.5一样快?

并且,在相关问题中,如何使Emacs安静地构建?目前,我的单元测试输出中几乎有80%是Emacs构建的。理想情况下,我想完全不make install打印任何输出。


您是否打算在某种CI平台上执行此操作?如果不是,您使用的是哪种计算机?显然,构建速度将非常取决于您的处理器,但是对我而言,它的./configure --with... && make -j (number of cores * 1.5)完成时间为30秒。如果在本地计算机上运行,​​请确保使用-j参数进行make。您有充分的理由这样做make install吗?如果仅从src目录运行emacs,这将增加一些时间,您可以避免。
Jordon Biondo

是Travis CI,但我不明白为什么这么重要?我想解释的是同一台机器上两个不同Emacs版本之间的明显差异。IOW为什么在同一系统上建立中继的时间要长五倍?
lunaryorn

从存储库进行构建需要创建某些文件,这些文件已存在于分布式tarball中。
politza

@politza什么文件?我知道我需要运行./autogen.shgenerate configure,但这只需要几秒钟,而不是几分钟。
lunaryorn

2
@lunaryom您在这里有三个独立的问题。1:如何快速构建emacs; 2:为什么emacs 25的构建速度比emacs 24.5和3:如何使make install运行无声。因此,请将这些问题分成3个问题,以便分别进行跟踪,并相应地进行编辑以坚持一个问题。
2015年

Answers:


8

24.5如此之快构建的原因是.elc文件实际上已在tarball中分发,请参见make-dist。从git编译时,大部分时间都花在了将.el文件编译到中.elc。通过优化C代码,Lisp编译可以运行得更快,但是仍然需要很长时间。使用原始设置(〜14 vs〜1分钟)和使用CFLAGS='-O2 -march=native'(〜9 vs〜1.5分钟)的构建比较构建时间。

同样,从git克隆大约需要一分钟,而下载和解压缩tarball大约需要5秒钟。从github下载git归档文件时比较版本之间的构建时间(对于v24.5,master和emacs-25,分别为〜5,〜6,〜8分钟。如您所见,当不使用发行版tarball时,所有构建时间至少是相同的数量级(不确定emacs-25为什么比master慢,可能是随机变化,还是在master中删除了一些过时的代码?)。

并且,在相关问题中,如何使Emacs安静地构建?目前,我的单元测试输出中几乎有80%是Emacs构建的。理想情况下,我想完全不make install打印任何输出。

您始终可以将输出重定向到/dev/null。在我的实验中,我通过管道将make install输出传递grep -E '^(make|[A-Z])'到,以减少输出(用于格式化网络日志的Travis CI javascript在使用完整输出时遇到了麻烦)。

如何使Emacs干线的构建速度与Emacs 24.5一样快?

否(或者是,从某种意义上讲,您可以使Emacs 24.5的构建(几乎)速度与Emacs trunk:p一样慢)。但是您可以做的是保存Emacs构建,然后下载该缓存的结果以进行单元测试。我已经在我的emacs-travis 分支上载分支中实现了这一点,这是yasnippet的使用示例:Emacs的安装时间约为2.5秒。


3

这里有各种建议。

  1. 没有elc文件。

如下所述,编译所有lisp文件至少需要10%的时间。一种禁用方法是编辑文件中的loaddefs目标lisp/Makefile并将其更改为:

    $(lisp)/loaddefs.el: $(LOADDEFS)
          true
  1. 没有编译器优化或调试器符号表

目前,我正在将--with-x-toolkit = no --without-x --without-all传递给./configure。

通过更改默认的编译标志,我能够在src中将C的编译时间减少到1/4的时间(从不到一分钟减少到16秒)。我得到的默认CFLAGS是:-g -O3

因此请改用CFLAGS=''

  1. 不要运行make install,而只是从src目录中运行内置的emacs 。

如下所述,还有10%的时间用于构建文档。尽管我没有计时,但是毫无疑问,有很多时间来复制文件和压缩elisp文件make install。所以不要这样 如果要重做时序图,请运行remake --profile

以上观察结果基于以下...


第一步是了解在哪里花费时间来确定如何减少时间。幸运的是,对于像Emacs这样的东西,我最近编写了(或者说扩展了)一个工具来帮助您找到答案。我添加了一个重制--profile选项(GNU make的一个分支),它将告诉您在特定目标上花费了多少时间。

我尝试构建最近的快照,是的,大约需要10分钟。如果您没有安装翻拍,则我对您可以用于跑步的性能分析信息有所了解。我使用kcachegrind来显示信息,但是可能还有用于可视化工具的其他工具。要点有一个png,是运行过程的屏幕截图。

现在到细节...

在我的运行中,大约20%的时间花在了构建Lisp和信息文件上,而您实际上并不需要这样做。实际上,在Lisp文件中比在信息文件中花费更多。您可以更改Makefile来跳过它。

与emacs 24进行比较可能会很有趣。我的猜测是,两者的大小均按比例增长。

如果有兴趣(可以通过投票显示),我将建议对Makefile进行一些修改。但是,对于那些有动力去工作的人来说,这本身就足够了。


“ 20%的时间都花在了构建Lisp上”-我克隆了@lunaryorn的emacs-travis回购,看来它make lisp为Emacs 25占用了大约60%的份额:travis-ci.org/npostavs/emacs-travis/builds/91107858。而且很大一部分都make src在编译Lisp,所以我想知道如何协调这些度量。在Emacs 24中,它似乎仅cc-*.el在期间编译文件make lisp,这是一个错误吗?
npostavs 2015年

同样,这可能是错觉,但在我看来,您的个人资料图片总计总计只有大约50%。
npostavs 2015年

@npostavs重制仅描述目标的时间,不包括其自身。对于所有在lisp下的文件和目录,有可能而且很可能在“ remake” /“ make”上花费了大量时间来计算要重新制作的内容。另外,即使“ remake”是make的fork,所以它们的工作类似,对于更紧密的比较,您应该将remake的性能分析输出时间与不带profil(而非“ make”)的“ remake”进行比较。使版本最后,尽管可以用%的等,整体建议,似乎可以用你的数据应用狡辩。
岩石

另外,我的测量方法是使用CFLAGS=''它使C编译更快,而Lisp编译更慢。事实证明,CFLAGS='-O2 -march=native'Emacs 25的总体使用速度较快,而Emacs 24.5的使用速度较慢:travis-ci.org/npostavs/emacs-travis/builds/91142923
npostavs 2015年

@npostavs您观察到:设置CFLAGS可以“使C编译更快,而Lisp编译更慢”。但是,如果您要运行单个测试,则不确定总体时间是否:经过优化的C编译/构建+ LISP编译+ LISP测试运行将少于未优化的C编译/构建+没有LISP编译+ LISP测试运行。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.