性能对比:Wild 与 Mold 链接器

Lobsters Hottest 工具

摘要

本文探讨了 Wild 与 Mold 链接器在基准测试结果中的差异,分析了文件系统、fork 设置等配置对性能的影响。

<p><a href="https://lobste.rs/s/gjjizm/benchmarking_wild_vs_mold">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/09/18 17:52

# 性能对比:Wild vs Mold | David Lattimore 来源:https://davidlattimore.github.io/posts/2026/09/18/benchmarking-wild-vs-mold.html David Lattimore \-2026\-09\-18 Mold 近期更新了其链接器性能测试(https://github.com/rui314/mold/blob/301382e5a25afcc145deff5ea9bc9eb967ed24af/README.md#benchmark),首次将 Wild 纳入对比。测试结果显示 Wild 的运行速度明显慢于 Mold,这与我们 8 月 4 日上一版本中发布的最新性能数据(https://github.com/wild-linker/wild/blob/0.10.0/benchmarks/ryzen-9955hx.md)形成反差。本文旨在探究测试结果差异的原因。 Mold 的性能测试运行于两台机器: - 搭载 Ubuntu 24.04 的 64 核(128 线程)Threadripper 主机 - 搭载 Asahi Linux 的 Apple M1 Ultra(16 性能核心) Wild 的最新性能测试运行于一台机器: - 搭载 Ubuntu 26.04 的 16 核(32 线程)Ryzen 9955hx 测试配置的关键差异之一在于输出文件处理方式:我们的测试保留了链接器前次运行生成的输出文件,而 Mold 的测试在每次调用间会删除输出文件。这对链接器性能影响显著,且效果高度依赖文件系统。Wild 历史上常在 tmpfs 文件系统上测试以降低干扰并避免 SSD 损耗——回顾来看这可能是个疏忽,因为大多数用户不会在 tmpfs 上构建。Mold 选择 ext4 文件系统则更为合理。未来我将采用混合测试方案。 另一差异在于 Mold 测试显式传入 `--no-fork` 参数(覆盖默认的进程分叉启动方式以减少关闭开销),而 Wild 测试仅在测量内存消耗时使用该参数,计时测试则保持默认设置。 接下来我们尝试在 16 核 Apple M1 上复现 Mold 测试结果。参照 Mold 方案,我们将两款链接器的构建产物更新至 2026\-08\-28 版本,并采用相同配置:ext4 文件系统 + 删除输出文件 + `--no-fork`。 首先展示 Mold 测试中相关项目的结果: | 程序 | Wild(秒) | Mold(秒) | 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(秒) | Mold(秒) | 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 基准测试 | 本次测试 | |------|---------------|----------| | blender\-debug | 1.2x | 1.2x | | godot\-debug | 1.3x | 1.2x | | blender\-release | 0.8x | 0.9x | | clang\-release | 1.0x | 1.0x | 考虑到 CPU 架构、缓存大小、内存等硬件差异,结果已足够接近。 成功复现部分结果后,我们深入探究 Wild 在不到一个月前发布的测试数据差异根源。 聚焦 clang\-release 基准测试(该测试同样存在于 Wild 公开数据中),我们尝试从 Mold 测试配置(ext4 + 删除 + no\-fork)到 Wild 历史配置(tmpfs + 不删除 + fork)的多种组合: | 基准测试 | Wild(秒) | Mold(秒) | Wild/Mold | |----------|------------|------------|-----------| | 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 + 不删除 + fork 配置。 Wild 在允许分叉、输出文件已存在且位于 tmpfs 时表现最佳——这与 Mold 测试配置截然相反。主要原因是 Wild 缺乏针对非 tmpfs 文件系统的文件创建与写入优化。Mold 作者在论文《mold:一个超大规模并行链接器》(https://arxiv.org/abs/2608.23228)中详细说明了这些优化,包括使用 `fallocate` 预分配空间及利用大页映射文件。Wild 已实现这些改进,将包含于下个版本。 但 Wild 8 月 4 日发布数据与 Mold 8 月 28 日数据仍存在显著差距。为此我收集了过去一年两款链接器各版本的 clang\-release 链接耗时。我使用自编译 clang 构建产物(因 Wild 0\.6\.0 不支持混合参数文件),并为 mold 添加 `--discard-section=.sframe` 参数以规避空 sframe 导致的崩溃(该问题已修复:https://github.com/rui314/mold/issues/1646)。这本质是独立但相似的基准测试。 各版本链接器耗时对比 可见 Mold 近期速度提升显著。Wild 的 8 月 4 日测试早于 Mold 2\.42\.0/2\.42\.1 发布,而主要性能提升正是源于这两个版本。 文章开头已复现 M1 Mac 上的 Mold 测试结果,但未能复现 Threadripper 结果。由于缺乏 64 核 Threadripper/384GiB 内存环境,我的 16 核 Ryzen 9955hx(92GiB RAM)仍属中高端配置。我推测额外差距可能源于线程数差异:Wild 在 128 线程下运行而 Mold 使用 32 线程。在我的 32 线程测试机上,Wild 随线程增加持续加速(尽管幅度递减)。正因如此,我未设置线程上限,但此仅为推测。欢迎拥有 Threadripper 的用户尝试不同线程数测试。 链接耗时与线程数关系图

相似文章

Mold 3.0.0 已发布

Lobsters Hottest

mold 3.0.0 已正式发布,这是一款高性能的 Unix 链接器即插即用替代品。基准测试显示,其中位链接速度比 LLVM lld 快 4.9 倍,比 wild 快 1.9 倍,并支持广泛的架构。

mold: 大规模并行链接器

Lobsters Hottest

mold 是一个大规模并行链接器,通过在所有阶段应用数据并行性来减少链接时间,实现了比最先进的链接器如 lld 快 2.4 到 16.1 倍的性能。