解析 Wild 与 Mold 链接器基准差异
Wild 项目负责人 David Lattimore 发文对照 Mold 最近更新的链接器基准(首次纳入 Wild)与 Wild 0.10.0(8 月 4 日)自测结果之间的差距。Mold 侧在 64 核 Threadripper 与 Apple M1 Ultra(Asahi Linux)上跑;Wild 自测主要在 16 核 Ryzen 9955hx。
配置差异是主要原因之一:Wild 历史基准常在输出文件已存在时测量,并多用 tmpfs 降噪;Mold 基准会在每次调用前删除输出文件,且多用 ext4。Mold 基准还传入 --no-fork(覆盖默认 fork 以降低退出成本),Wild 测时间时通常保留默认 fork,只在测内存时加 --no-fork。
作者在接近 Mold 的条件(ext4、删除输出、--no-fork、2026-08-28 双方 release 构建)下复现了相近比值,例如 blender-debug 约 1.2×、godot-debug 约 1.2–1.3×、clang-release 约 1.0×。在 clang-release 上从 Mold 配置逐步切回 Wild 历史配置(tmpfs + 不删输出 + fork)时,Wild/Mold 可从约 1.0× 降到约 0.6×。作者指出当前 Wild 在非 tmpfs 上新建/写文件仍缺少 Mold 论文中的 fallocate 预分配与 hugepage 映射等 OS 侧优化,相关改动已合入并将随下一版本发布。另外,对近一年各版本的 clang-release 扫描显示 Mold 在 2.42.0 / 2.42.1 附近明显变快,而 Wild 8 月 4 日基准发布时尚早于这些版本。Threadripper 上更大差距是否与 Wild 默认开满 128 线程、Mold 约 32 线程有关,仍待更多硬件验证。
原文链接:https://davidlattimore.github.io/posts/2026/09/18/benchmarking-wild-vs-mold.html
iceoryx2 0.10:无界零拷贝与 FlatBuffers
eclipse-iceoryx 的 iceoryx2 v0.10.0 发布。iceoryx2 是面向数据密集型系统的进程间通信库,强调超低延迟与零拷贝,提供 C / C++ / Python / Rust / C# 绑定,支持 Linux、macOS、Windows、FreeBSD、QNX 等,并有 Android / VxWorks 实验支持;模式包括 pub-sub、event、request-response 与共享内存 blackboard,架构无中心 broker。
0.10 重点包括:共享内存中可动态增长的无界 payload,同时保持零拷贝;原生 FlatBuffers 集成与 FlatBuffers allocator,可对已 loan 的 sample 做再分配,并在共享内存中直接构建/消费序列化数据,减少序列化路径上的额外拷贝。事件模式重构后可保证通知不丢失,listener 等待时可同时得到 event id 与该事件被发送的次数。网关 / tunnel 侧去掉热路径分配,增加 allowlist 与响应式执行模式等,并有进行中的 ROS 2 gateway。官方说明 iceoryx classic 已进入维护,年底对非客户支持将结束,建议开始迁移评估。发布说明见 ekxide 博客与 GitHub release。
原文链接:https://ekxide.io/blog/iceoryx2-0.10-release/
pg_raw_parse:直接映射 Postgres 解析器的 Rust SQL 解析
pg_raw_parse 是用于解析 Postgres SQL 的 Rust 库,主要服务于 PgDog,也可在其他项目中通过 git 依赖使用。它基于 libpg_query,并通过宏在 Postgres arena allocator 之上直接生成内存安全的 Rust 结构体与绑定,而不是像常见绑定那样经 Protobuf 做跨 FFI 的 AST 序列化。
作者给出的 M1 Max 基准中,相对 pg_query.rs,parse 约 20–60×(随节点规模上升,10k 节点约 59×),内存约少 90%;deparse 约 15–18×;normalize 约 1.2–1.4×。API 覆盖 parse / deparse / normalize,以及 walk、构造 AST、transform 等。升级大版本 Postgres 时主要通过 bump 子模块并重编译生成代码。仓库:https://github.com/pgdogdev/pg_raw_parse 。
原文链接:https://github.com/pgdogdev/pg_raw_parse
可视化 ABA 问题与 crossbeam-epoch 的动机
作者 Sofia 从 C++ 转向 Rust 后,用一篇教程复现无锁结构中的 ABA 问题,说明所有权模型无法单独覆盖这类场景。文中实现朴素 lock-free stack:push / pop 用 AtomicPtr 与 CAS,节点经 Box::into_raw / from_raw 管理。
典型交错为:线程 1 读到 head=A 且 A.next=B 后被调度走;线程 2 弹出并释放 A、B,再在同一地址分配新节点 A' 入栈;线程 1 的 compare_exchange(expected=A, new=B) 因地址仍为 A 而成功,却把已释放的 B 写回 head,形成悬垂指针。作者用延迟与分配器地址复用复现后,进程未必 segfault(内存仍可能映射),但 Miri 可报 data race / UB。文中列出 tagged pointer、hazard pointer、延迟回收与 epoch-based reclamation(crossbeam-epoch)等方向,并指向 Aaron Turon 关于 epoch 的文章;实验代码见 sofiabelen/visualizing-crossbeam-epoch。
原文链接:https://sofiabelen.github.io/projects/visualizing-the-aba-problem/
From Rust中文社区 Mike
社区学习交流平台订阅:
评论区
写评论还没有评论