【Rust日报】2026-09-19 解析 Wild 与 Mold 链接器基准差异

💡 原文中文,约2900字,阅读约需7分钟。
📝

内容提要

Wild 作者对比 Wild 与 Mold 链接器基准,发现配置差异(输出删除、文件系统、fork)导致结果不同,复现后差距缩小至约 1.0–1.3×。iceoryx2 0.10 发布,新增无界零拷贝 payload 与 FlatBuffers 集成。pg_raw_parse 直接映射 Postgres 解析器,解析速度提升约 20–60×。另有文章可视化 ABA 问题并介绍 crossbeam-epoch 的动机。

🔎

延伸解读

基准测试配置差异的影响

Wild 与 Mold 的基准差异主要源于配置不同:Wild 历史基准常在输出文件已存在时测量并使用 tmpfs,而 Mold 基准每次删除输出文件且多用 ext4,还传入 --no-fork。在接近 Mold 的条件下复现后,差距缩小至约 1.0–1.3×。这表明链接器性能对比需严格控制变量,否则结论可能失真。

Wild 的优化方向与版本时机

Wild 在非 tmpfs 上新建/写文件时仍缺少 Mold 论文中的 fallocate 预分配与 hugepage 映射等 OS 侧优化,相关改动已合入并将随下一版本发布。此外,Mold 在 2.42.0/2.42.1 附近明显变快,而 Wild 8 月 4 日基准发布时尚早于这些版本,因此当前对比可能未反映双方最新状态。

iceoryx2 0.10 的关键改进

iceoryx2 0.10 新增共享内存中可动态增长的无界 payload,同时保持零拷贝;原生 FlatBuffers 集成允许对已 loan 的 sample 再分配,并在共享内存中直接构建/消费序列化数据,减少额外拷贝。事件模式重构后保证通知不丢失,listener 可同时获取 event id 与发送次数。官方建议 iceoryx classic 用户开始迁移评估。

pg_raw_parse 的性能与实现特点

pg_raw_parse 基于 libpg_query,通过宏在 Postgres arena allocator 上直接生成内存安全的 Rust 结构体与绑定,避免经 Protobuf 做跨 FFI 的 AST 序列化。在 M1 Max 基准中,parse 比 pg_query.rs 快约 20–60×,内存少约 90%;deparse 快约 15–18×,normalize 快约 1.2–1.4×。升级大版本 Postgres 时需 bump 子模块并重编译生成代码。

Q&A

Wild 和 Mold 链接器基准测试结果差异的主要原因是什么?

主要原因是配置差异,包括是否在每次调用前删除输出文件、使用的文件系统(tmpfs 还是 ext4)以及是否使用 --no-fork 选项。这些差异导致基准结果不同。

在接近 Mold 的测试条件下,Wild 和 Mold 的性能差距有多大?

在接近 Mold 的条件下(ext4、删除输出、--no-fork、2026-08-28 双方 release 构建),Wild 与 Mold 的比值约为 1.0–1.3×,例如 blender-debug 约 1.2×、godot-debug 约 1.2–1.3×、clang-release 约 1.0×。

iceoryx2 0.10 版本有哪些主要新特性?

主要新特性包括:共享内存中可动态增长的无界 payload 且保持零拷贝;原生 FlatBuffers 集成与 FlatBuffers allocator,可在共享内存中直接构建/消费序列化数据;事件模式重构保证通知不丢失;网关/隧道侧去掉热路径分配,增加 allowlist 与响应式执行模式等。

pg_raw_parse 相比 pg_query.rs 在解析性能上有哪些提升?

在 M1 Max 基准中,pg_raw_parse 的 parse 速度约是 pg_query.rs 的 20–60 倍(随节点规模上升,10k 节点约 59 倍),内存占用约少 90%;deparse 约 15–18 倍;normalize 约 1.2–1.4 倍。

什么是 ABA 问题?在无锁栈中如何发生?

ABA 问题是指在无锁数据结构中,一个值从 A 变为 B 再变回 A,导致 CAS 操作误以为没有变化而成功。在无锁栈中,线程 1 读到 head=A 且 A.next=B 后被调度走;线程 2 弹出并释放 A、B,再分配新节点 A' 入栈;线程 1 的 CAS 因地址仍为 A 而成功,却把已释放的 B 写回 head,形成悬垂指针。

解决 ABA 问题有哪些常见方法?

常见方法包括 tagged pointer、hazard pointer、延迟回收以及基于 epoch 的回收(如 crossbeam-epoch)。

🏷️

标签

➡️

继续阅读