性能对比:Wild 与 Mold 链接器
摘要
本文探讨了 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 已发布
mold 3.0.0 已正式发布,这是一款高性能的 Unix 链接器即插即用替代品。基准测试显示,其中位链接速度比 LLVM lld 快 4.9 倍,比 wild 快 1.9 倍,并支持广泛的架构。
mold: 大规模并行链接器
mold 是一个大规模并行链接器,通过在所有阶段应用数据并行性来减少链接时间,实现了比最先进的链接器如 lld 快 2.4 到 16.1 倍的性能。
为本地LLM提供大量答案的新旧基准测试
本文介绍了一个用于评估本地LLM配置的基准测试工具,重点关注显存使用情况、性能指标和硬件优化,以协助开发者优化配置。
同一系统,评分随评判者不同而大相径庭。你该如何解读记忆基准测试?
讨论了 LLM 记忆基准测试有多不可靠:同一套答案在 token 重叠 F1 下得分 51.4,而在 LLM 评判者下得分 75.8,分数随评判模型、读取记忆的模型以及运行次数剧烈波动;而且许多结果由厂商自行报告,噪声水平不明。
两个MMLU分数:基准名称未能解决的问题(23分钟阅读时间)
本文探讨了MMLU基准分数的问题,表明由于开放的评估变量,不同的模型构建可能会产生不可比的准确性,并提出了一种内容寻址框架以提高可追溯性。