本期检索说明
先读取 content/collections/deep-radar 截至 2026-10-10 的全部原文链接,并按 URL、标题与实现机制去重。最近 24 小时找到 Rust Result::unwrap 的异常清理路径优化;回溯最近 7 天后,再纳入 rustc Span::to 的寄存器级快路径。OpenJDK Curve448 的 8×56-bit limb 改造虽然仍是高质量候选,但已于 10 月 9 日收录,按去重规则剔除。Kotlin/Native late shadow stack 有大规模源码与机制说明,却尚未公开可量化 benchmark;Zig 与 Linux 本周期也没有同时满足实测数据、源码证据和原理剖析三条红线的新材料,因此不凑数。
两篇都处于开放评审,数字必须按试验性质理解。Span::to 的官方 rustc-perf 结果较完整:138 个 primary instruction 样本全部改善,但 cycles 与 RSS 仍有双向波动。unwrap 补丁的第一轮 perf run 在 48 个 primary instruction 样本上总体改善 0.2%,同时有 3 个样本回退、两个 RSS 样本回退 3.8%–9.0%;它是值得研究的 codegen 交换,不是已经证实的无条件性能胜利。
| 主题 | 原始发布日期 | 一手来源与交叉验证 | 截稿状态 | 推荐强度 |
|---|---|---|---|---|
Rust Result::unwrap 移除调用方 landing pad |
2026-10-10 05:27(中原标准时间) | Rust PR #164059 / 4 文件源码 diff / Compiler Explorer 汇编 / 官方 rustc-perf | 开放评审,存在 perf 回退待解释 | 强烈推荐,重点看所有权移动如何改变异常清理 CFG |
rustc Span::to inline-only 快路径 |
2026-10-08 15:18(中原标准时间) | Rust PR #163971 / 8 个 commit / 源码与寄存器路径说明 / 官方 rustc-perf | 开放评审 | 强烈推荐,重点看表示层不变量如何变成无栈帧热路径 |
01 · Rust Result::unwrap:把错误值的析构责任移进冷函数,热调用方不再保留 landing pad
原文与日期: jnkel,2026-10-10 05:27(中原标准时间);Rust PR #164059、完整源码 diff、Compiler Explorer 汇编对照 与 官方 rustc-perf 第一轮结果。
为什么值得读: 这是一个只有几行核心 API 变化、却会重画异常控制流的案例。旧实现把 Err(e) 以 &dyn Debug 借给 unwrap_failed;从 Rust 的所有权视角看,e 仍属于 unwrap。即使 unwrap_failed 的正常返回类型是 !,在 panic=unwind 下它仍可能开始栈展开,调用方必须保留清理路径来析构 e。因此几乎永远不走的错误路径,反过来让成功路径也背上栈帧、保存寄存器与 landing pad,并阻碍 MIR inlining。
核心技术结论: 补丁把四处 unwrap_failed(msg, &e) 改为按值传递,并把冷函数泛型化:
fn unwrap_failed<T: fmt::Debug>(msg: &str, error: T) -> ! {
#[inline(never)]
#[track_caller]
fn unwrap_failed_inner(msg: &str, error: &dyn fmt::Debug) -> ! {
panic!("{msg}: {error:?}")
}
unwrap_failed_inner(msg, &error)
}移动 error 后,析构责任也进入 unwrap_failed::<T>;调用方不再需要在 unwind edge 上 drop e。真正的格式化仍通过内层 &dyn Debug 多态函数完成,避免把整段 formatting 逻辑按错误类型复制。代价是每种 T 都要单态化一个很薄的外层冷函数,所以这是“减少调用方 EH/code size”与“增加冷路径 monomorphization”之间的显式交换。
最有价值的实验、源码与 benchmark 细节: 作者提供的带析构错误类型汇编把差异直接暴露出来。旧 unwrap 入口先 push r14; push rbx; sub rsp, 24,即使 Ok 路径也要在返回前恢复栈;调用 unwrap_failed 后还保留打印、_Unwind_Resume 与 panic_in_cleanup 的 landing pad。新入口从 cmp qword ptr [rsi], -1 开始,Ok 分支搬运 24 字节结果后直接 ret;只有 Err 分支才 push rax 并调用 unwrap_failed::<Error>。对应 MIR 测试也从一个外部 Result::unwrap 调用变成 discriminant switch,成功分支直接移动 payload,证明该函数现在可被 MIR inline。
第一轮官方 rustc-perf 的 instruction count:45 个 primary 样本平均改善 0.3%(范围 -0.6% 至 -0.1%),3 个 primary 样本平均回退 0.6%(0.3% 至 1.1%);48 个 primary 总体为 -0.2%。linked artifact size 的 75 个 primary 结果总体 -0.3%,但范围从 -2.5% 到 +1.3%;bootstrap 487.936 → 487.208 秒(-0.15%)。负向数据不能省略:max-RSS 的两个回退样本为 +3.8% 至 +9.0%,整体 primary RSS 为 +0.7%。这也是 PR 仍带 perf-regression、不能 rollup 的原因。
适合的工程师背景: 熟悉 Rust 所有权、panic unwind、MIR/LLVM codegen,或正在优化带异常清理语义的 C++/Rust/Swift 通用库热路径的工程师。
预计阅读收益: 约 35–45 分钟;能学会从“按引用还是按值”追到 landing pad、栈帧与内联结果,并掌握如何同时检查指令数、二进制体积与 RSS,避免只凭一段漂亮汇编宣布胜利。
02 · rustc Span::to:先证明两个 span 都是 inline-context,再把合并压成寄存器运算
原文与日期: Josh Triplett,2026-10-08 15:18(中原标准时间);Rust PR #163971、完整源码 diff 与 官方 rustc-perf 结果。
为什么值得读: 编译器里的 source span 看似只是 lo/hi/context 三元组,但宏卫生、父定义与 interning 让一次合并可能需要解码、加锁、递归查询 callsite,甚至把 SpanData spill 到栈上。Span::to 又是 parser、宏展开与诊断生成的高频路径。这个 PR 的工程价值不只在于“手写 fast path”,而在于先利用前置 span-encoding 改造暴露出的表示不变量:最常见的 InlineCtxt 格式已经把 lo:32 + ctxt:16 + len:15 装入一个 u64,且没有 parent,因此常见情况可以完全绕开 interner 和通用 SpanData。
核心技术结论: 新实现先尝试把两个参数都解码为 InlineCtxt,要求 context 相等,再只用 lo/len 计算并集;结果仍能塞回 inline format 就立即返回,否则退到 #[inline(never)] to_non_inline:
if let Some(from) = InlineCtxt::try_from_span(self)
&& let Some(to) = InlineCtxt::try_from_span(end)
&& from.ctxt == to.ctxt
{
let lo = cmp::min(from.lo, to.lo);
let len = cmp::max(from.lo + from.len, to.lo + to.len) - lo;
if let Some(span) = InlineCtxt::try_new_span(lo, len, from.ctxt) {
return span;
}
}
self.to_non_inline(end)配套改动同样关键。Span::new_ordered 允许已知 lo <= hi 的调用点跳过交换检查;prepare_to_combine 删除了逻辑上不可能改变结论的 source_callsite() 递归;try_metavars 只传两个 context,并以 Option<SpanData> 返回真正需要替换的一侧,避免先把两份完整 SpanData 落栈。它们共同把“常见格式、相同 context、无 parent、结果仍可内联”的条件收窄成一个可由寄存器完成的路径,而不是把所有罕见语义塞进热函数。
最有价值的实验、源码与 benchmark 细节: 作者明确指出最终 Span::to 热路径没有栈帧,也不保存寄存器;此前 profile 中可见的 SpanData spill 被拆分参数和返回值消除。官方 rustc-perf 给出罕见的整齐 primary 结果:138 个 instruction-count primary 样本全部改善,均值 -0.5%,范围 -1.2% 至 -0.3%,没有 primary 回退;79 个 secondary 改善样本均值 -0.8%,另有 6 个 secondary 回退 0.6%–0.7%。bootstrap 492.261 → 488.235 秒,缩短 4.026 秒(-0.82%);artifact size 408.66 → 406.28 MiB(-0.58%)。
仍需保留噪声边界:cycles 的 161 个 primary 显著样本总体只有 -0.2%,范围 -6.3% 到 +5.0%;max-RSS 的 80 个 primary 显著样本总体 -0.4%,但单项范围 -2.8% 到 +2.2%。因此最稳的结论是“动态指令普遍减少”,而不是所有 wall-clock 或内存样本都等比例改善。PR 还建立在 span compression overhaul 之上,评审和复测都应锁定同一基线。
适合的工程师背景: 熟悉 rustc span/hygiene、紧凑数据表示、profile-guided hot-path 分拆,或在编译器中优化高频小对象与 interner 的工程师。
预计阅读收益: 约 45–60 分钟;能掌握如何把表示层统计转成 fast-path guard、如何把罕见语义隔离到冷函数,以及怎样用全量 benchmark 分布验证微优化没有只照顾单个 workload。
中国大陆 ToC 硬件价格观察
数据口径
窗口为 2026-09-12 至 2026-10-11,单位人民币,六类硬件固定同一 SKU。今天通过公开比价页的实时渲染结果复核到 CPU、GPU、主板、HDD、SSD 五类报价;DRAM 页面仍明确显示“暂无报价”,因此不新增点。重复价格作为真实采样保留,用来区分“已复核横盘”和“未取得数据”。SSD 只采用当前 2TB 规格的全网比价栏,不采用跨容量聚合的“¥819 起”。
| 类别 | 10 月 11 日可复核价 | 30 日窗口内真实走势 | 建议 |
|---|---|---|---|
| CPU | Ryzen 7 9800X3D,京东 ¥2,609 | 9/14 ¥2,639 → 9/23 ¥2,579 → 10/1–8 ¥2,694–2,699 → 10/9–11 ¥2,609 | 可关注但不追价;连续三日维持 ¥2,609,仍高于窗口低点 ¥30 |
| GPU | MSI RTX 5070 VENTUS 3X 12G,亚马逊中国 ¥4,464.34 | 9/12–10/11 多次实时复核均为 ¥4,464.34 | 刚需可比价后入手;单一渠道横盘不等于全市场没有促销 |
| 主板 | ASUS TUF B850M-PLUS WIFI7,天猫 ¥1,299 | 9/12–10/11 多次复核均为 ¥1,299 | 刚需可入;公开最低价稳定,但下单前核对店铺与售后 |
| DRAM | 暂无报价;最后可复核 9/9 ¥3,900 | 本窗口没有可比报价 | 观望;固定 SKU 缺价,不用其他容量、颗粒或时序替代 |
| HDD | IronWolf Pro 8TB ST8000NE001,i百联 ¥1,849 | 9/12–10/11 多次复核均为 ¥1,849 | 容量刚需可买;先核对型号、五年保修与数据恢复服务 |
| SSD | ZHITAI Ti600 2TB,京东 ¥1,799 | 9/23–10/11 多次复核均为 ¥1,799 | 观望或确认结算价后入手;2TB 比价横盘,聚合栏可能滞后 |
价格来源: 9800X3D、MSI RTX 5070 VENTUS 3X、ASUS TUF B850M-PLUS WIFI7、Kingston FURY DDR5-6000 32GB、IronWolf Pro 8TB、ZHITAI Ti600 2TB。
判断依据
五个有报价的固定 SKU 今天全部与昨日一致。CPU 在 10 月 9 日从 ¥2,699 回落至 ¥2,609,已连续三日维持,但仍比 9 月 23 日低点 ¥2,579 高 ¥30;现有序列只支持“回落后横盘”,不足以判断还会继续下跌。GPU、主板、HDD 与 SSD 只是同一公开渠道再次复核到相同最低价,不能外推为整个中国零售市场稳定。DRAM 固定 SKU 继续缺价,走势图保留真实空白尾段。SSD 页面头部“¥819 起”是跨容量聚合口径,当前选中的 2TB 规格全网比价仍为 ¥1,799,二者不能混用。本期购买建议只依据可复核价格序列,不引用未核实的新品或产能传闻。
本期结论
两篇材料展示了同一种优化方法在不同层次的应用:先把罕见语义移出热路径,再让常见路径只携带完成工作所必需的状态。Result::unwrap 通过移动所有权把析构和 unwind 清理责任交给冷函数,换来成功路径无 landing pad;Span::to 则用紧凑表示的不变量把通用 interner/hygiene 逻辑隔离到 to_non_inline,让最常见合并留在寄存器中。真正可迁移的经验是同时验证控制流、汇编和全量 benchmark 分布,并把回退样本留在结论里。