开发者生态
morning
野生与霉菌的基准测试
摘要
David Lattimore - 2026-09-18 Mold has recently updated their linker benchmarks and included Wild for the first time. These benchmarks show Wild being substantially slower than Mold in contrast to Wild...
benchmarks
the
Mold
Wild
run
and
difference
file
linker
output
2026-09-20
1 阅读
约8分钟阅读
birdculture
字号:
David Lattimore - 2026-09-18 Mold 最近更新了其链接器基准,并首次包含 Wild。这些基准测试显示,与我们 8 月 4 日上次发布的 Wild 最近发布的基准相比,Wild 比 Mold 慢得多。这篇文章试图理解为什么基准测试结果存在如此大的差异。 Mold 的基准测试在两台机器上运行: 运行 Ubuntu 24.04 的 64 核(128 线程)Threadripper 运行 Asahi Linux Wild 的 Apple M1 Ultra(16 个性能核心)在一台机器上运行: 运行 Ubuntu 26.04 的 16 核(32 线程)Ryzen 9955hx 基准测试配置的一个重大差异与输出文件有关。我们的基准测试使用上次运行链接器时已经存在的输出文件运行。 Mold 的基准测试会删除链接器调用之间的输出文件。这会对链接器的性能产生重大影响。它所带来的差异也非常依赖于文件系统。 Wild 的基准测试历来在 tmpfs 上运行,这样做是为了减少基准测试中的噪音并避免磨损 SSD。回想起来,这可能是一个错误,因为大多数用户不太可能在 tmpfs 上进行构建。 Mold的基准测试使用ext4,这是一个更明智的选择。展望未来,我可能会混合两者。另一个区别是 Mold 的基准测试通过了 --no-fork ,覆盖了默认行为,即在启动时进行分叉以降低关闭成本。 Wild 的基准测试在测量时间时将此设置保留为默认值,并且在测量内存消耗时仅通过 --no-fork。我们现在将尝试重现与 Mold 基准测试在 16 核 Apple M1 上显示的结果类似的结果。与 Mold 的基准测试一样,我们已于 2026 年 8 月 28 日完成了两个链接器的发布版本。为了使结果尽可能相似,我们将输出文件放在 ext4 上,并在每次运行和传递 --no-fork 之间删除该文件。首先,这是我们将要运行的基准测试的 Mold 基准测试结果的子集: Program Wild (s) Mold (s) Wild/Mold Blender-debug 1.81 1.56 1.2x godot-debug 0.81 0.62 1.3x Blender-release 0.20 0.25 0.8x clang-release 0.15 0.14 1.0x 以下是我们的结果: 基准 Wild (s) Mold (s) Wild/Mold Blender-debug 2.23 1.79 1.2x godot-debug 1.11 0.89 1.2x Blender-release 0.30 0.33 0.9x clang-release 0.21 0.20 1.0x 将 Wild/Mold 比率放在一张表中: 程序 Mold benchmark 这个基准Blender-debug 1.2x 1.2x godot-debug 1.3x 1.2x Blender-release 0.8x 0.9x clang-release 1.0x 1.0x 鉴于我们在具有不同缓存大小、RAM 等的不同 CPU 架构上运行,结果与我们预期的一样接近。现在我们已经成功地重现了一些类似的结果,我们可以深入研究一下为什么基准测试结果与 Wild 不到一个月前发布的结果如此不同。我们将重点关注 clang-release 基准,因为这是 Wild 在其发布的基准集中的基准。我们尝试了几种不同的配置,从 Mold 基准测试使用的配置(ext4+delete+no-fork)开始,到 Wild 历史上使用的配置(tmpfs+no-delete+fork)结束。基准 野生 (s) 霉菌 (s) 野生/霉菌 clang-release.ext4-delete-no-fork 0.21 0.20 1.0x clang-release.ext4-no-delete-no-fork 0.14 0.20 0.7x clang-release.tmpfs-delete-no-fork 0.16 0.20 0.8x clang-release.tmpfs-no-delete-no-fork 0.14 0.19 0.7x clang-release.tmpfs-no-delete-fork 0.11 0.19 0.6x 在本文的其余部分,我们将使用 tmpfs+no-delete+fork 配置。 Wild,至少是这里基准测试的版本,在允许分叉并且输出已经存在并且位于 tmpfs 上时表现最好。即与模具基准中使用的配置相反。但这主要是由于 Wild 缺乏特定于操作系统的调整,无法在非 tmpfs 文件系统上快速创建和写入新文件。 Mold 的作者在纸模中描述了这些:A Massively Parallel Linker。具体来说,使用fallocate为文件预先分配空间并使用hugepages来映射文件。这两项更改已在 Wild 中进行,并将包含在下一个版本中。但 Wild 8 月 4 日发布的基准测试和 Mold 8 月 28 日发布的基准测试之间仍然存在相当大的性能差异。为了了解那里发生了什么,我对过去一年多时间里的 Mold 和 Wild 的每个版本进行了基准测试。我们再次对 clang-release 进行基准测试。对于这个基准测试,我使用了我自己的 clang 版本,因为 Wild 0.6.0 不支持将参数文件与常规命令行参数混合。我还将 --discard-section=.sframe 传递给 Mold 以解决遇到空 sframe 时出现的故障。此问题已修复,但我想使用没有修复的模具版本运行基准测试。实际上,这应该被视为一个单独的基准,但与上面的 clang-release 类似。由此可见,模具最近
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱