本期检索说明

先读取 content/collections/deep-radar 截至 2026-09-30 的全部原文链接,并按 URL、标题与机制去重。最近 24 小时找到两项同时给出实测、完整源码差异与原理链路的新材料:HotSpot C2 消除 Vector API 值跨非内联边界时的堆物化,以及 Rust 标准库为 BTreeMap::Iter / Range 增加同节点快路径。Kotlin、Zig 与 Linux 的新候选没有同时满足三条证据红线,本期不凑数。

两项 PR 截稿时都仍在开放评审,本文评价的是公开 patch、回归测试和作者/官方性能系统给出的数据,不把它们写成已发布能力。OpenJDK 项目的结果是每调用分配量而非吞吐;Rust 项目的库级 microbenchmark 提升很大,但 rustc-perf 同时出现最大 RSS 回退,二者口径必须分开。

主题 原始发布日期 一手来源与交叉验证 截稿状态 推荐强度
Vector API 热调用边界零装箱 2026-09-30 23:34(中原标准时间) OpenJDK PR #33152 / 完整 HotSpot 与 jtreg patch / JBS / 分配计数实验 开放评审,尚未合入 强烈推荐,重点看 C2 阶段顺序与内联门槛
BTreeMap 同叶节点迭代快路径 2026-09-30 11:39(中原标准时间) Rust PR #163521 / navigate.rs 完整 patch / 库级 benchmark / rustc-perf 开放评审,尚未合入 强烈推荐,重点看 cursor 快路径与 unsafe 不变量

01 · JVM:让热 Vector 签名方法进入同一个 C2 编译单元

原文与日期: vpelikh,2026-09-30 23:34(中原标准时间);OpenJDK PR #33152、完整源码 patch 与 JDK-8393271。

为什么值得读: Vector API 的“零成本”并不自动跨越 Java 方法边界。一个 386-byte 的用户方法连续执行十余个向量操作,会超过默认 FreqInlineSize=325,被 C2 以 hot method too big 拒绝内联。调用方此时必须把 SIMD 值物化为 vector proxy 对象及其 primitive array payload;四个 ByteVector 参数每次调用产生 192 B 堆分配。

核心技术结论: 补丁新增 ciMethod::has_vector_payload_in_signature(),检查返回值或声明参数是否为 jdk.internal.vm.vector.VectorPayload 子类。热调用点遇到此类方法时,InlineTree::should_inline 跳过字节码尺寸门槛;should_not_inline 也不再因已有大 nmethod 拒绝。它没有无限放宽内联:深度、递归、MaxInlineLevel、DesiredMethodLimit=8000、NodeCountInliningCutoff=18000 与 LiveNodeCountInliningCutoff=40000 仍然生效,实测 12006-byte 方法仍被拒绝。

C++
if (has_vector_payload_in_signature(callee_method)) {
  return true;
}

if (callee_method->has_compiled_code() &&
    callee_method->inline_instructions_size() > InlineSmallCode &&
    !has_vector_payload_in_signature(callee_method)) {
  return true;
}

最有价值的实验、源码与 benchmark 细节: 参数数量给出了近乎教科书式的因果拆分:四个 vector 参数 192 B/call、一个参数 48 B/call、零参数 0 B/call;非内联返回一个 vector 同样是 48 B/call。成功内联后,参数与返回值两条路径都变为 0.00 B/call。新 jtreg 每个测量窗口调用 200 万次,取 10 个窗口的最小值,并分别在 tiered 与 -XX:-TieredCompilation 下运行。

机制证据比数字更重要:物化由 PhaseVector::optimize_vector_boxes() 产生,它早于 ConnectionGraph::do_analysis();经典逃逸分析根本看不到 VectorBox / VectorUnbox / VectorBoxAllocate。因此 -XX:-DoEscapeAnalysis 不改变 192 → 192 与补丁后的 0 → 0,而关闭 EnableVectorReboxing 反而把 192 放大到 1472 B/call。这说明修复点确实是“让 callee 进入同一 C2 编译单元”,不是普通 ArgEscape 调参。

边界也必须保留:冷调用点和 -Xcomp 无 profile 的路径不享受豁免;应用 classpath 上的 @ForceInline 会被类加载器丢弃,只有 boot/platform loader 等特权代码能使用;当前公开结果只验证分配消失,没有给出端到端吞吐、代码体积或 instruction-cache 代价。长期更彻底的方案仍是 vector calling convention。

适合的工程师背景: 熟悉 C2 内联、Vector API、escape analysis,或正在排查 SIMD 优化在 helper 方法边界突然产生 GC 压力的 JVM 性能工程师。

预计阅读收益: 约 35–50 分钟;能学到如何用“参数个数 × 每参数字节数”、编译阶段顺序和诊断开关把装箱归因到正确层级,以及如何在修复启发式时保留图规模上限。

02 · Rust:BTreeMap 在同一叶节点内不必重走导航状态机

原文与日期: ywxt,2026-09-30 11:39(中原标准时间);Rust PR #163521、完整源码 patch 与 rustc-perf 对比。

为什么值得读: BTreeMap::Iter::next 的绝大多数步进仍在同一 leaf node 内,旧实现却每次调用通用的 next_kv(),再从 KV 构造下一条 leaf edge。补丁把“节点内移动”和“跨节点导航”明确拆开:只有 idx == len(反向则 idx == 0)时才走旧慢路径。

核心技术结论: 新的 perform_next_unchecked 读取当前 edge 的 idx 与 node len。若 idx < len,直接以 Handle::new_edge(node, idx + 1) 更新 cursor,并以 Handle::new_kv(node, idx) 产出当前键值;反向路径用 idx - 1。同一实现通过闭包复用于 immutable、ValMut、LeafRange 和 Range,跨节点时仍回退到经过验证的 next_kv / next_back_kv。

Rust
let idx = self.idx();
let len = self.reborrow().into_node().len();
if idx < len {
    let node = unsafe { ptr::read(self) }.into_node();
    *self = unsafe { Handle::new_edge(ptr::read(&node), idx + 1) };
    f(&unsafe { Handle::new_kv(node, idx) }.forget_node_type())
} else {
    // 只在叶节点边界调用通用导航
    let kv = super::mem::replace(self, |edge| {
        let kv = edge.next_kv().ok().unwrap();
        (unsafe { ptr::read(&kv) }.next_leaf_edge(), kv)
    });
    f(&kv)
}

最有价值的实验、源码与 benchmark 细节: AArch64 库级 microbenchmark 覆盖正向、反向、可变、range 与 20/1000/100000 三种规模。range_iteration_20 从 380.62 ± 4.55 降到 99.54 ± 1.49 ns/iter,缩短 73.8%;普通 iteration_100000 从 2,048,028 ± 38,646.50 降到 893,023 ± 6,601.05 ns/iter,缩短 56.4%;12 个主要 iteration 样本的改善范围为 50.3%–72.0%。set difference/intersection 也出现约 17.1%–54.8% 改善,但 is_subset_10k_vs_100 从 2.35 变为 2.46 ns/iter,回退 4.7%,说明并非所有上层操作受益。

官方 rustc-perf 提供了另一层边界:可靠的 instructions:u 在 6 个 primary 样本平均改善 1.0%,范围 0.4%–2.0%,没有显著指令回退;但最大 RSS 有 2 个 primary 样本平均回退 4.2%(3.4%–5.0%),另有 1 个 secondary 回退 2.4%。bootstrap 仅从 489.840 s 到 489.542 s(-0.06%)。因此可以说库级游标热路径明显更短,不能说所有 Rust 程序或 rustc wall-clock 都获得同等幅度提升。

unsafe 设计值得逐行审计:调用者保证方向上还有 KV,cursor 单调移动且不越过另一端;ptr::read 复制 handle 只为同时形成新 edge 与当前 KV,原 self 随即被替换;可变版本额外要求返回的 KV 不与其他 live mutable reference 别名。性能收益来自把这些不变量显式编码进专用快路径,而不是减少边界检查这么简单。

适合的工程师背景: 维护 Rust collections、树结构 cursor、双端迭代器,或需要在 unsafe 内核与安全公共 API 之间建立可审计快路径的基础库工程师。

预计阅读收益: 约 35–50 分钟;能学到如何用索引不变量绕过高频通用状态机、如何让同一快路径覆盖 immutable/mutable/range,以及如何同时读库级 microbenchmark 与编译器全局指标。

中国大陆 ToC 硬件价格观察

数据口径

窗口为 2026-09-02 至 2026-10-01,单位人民币,六类硬件固定同一 SKU。今天通过公开比价页的实时渲染结果复核到 CPU、GPU、主板、HDD、SSD 五类报价;DRAM 页面仍明确显示“暂无报价”,因此不新增点。重复价格作为真实采样保留,用来区分“已复核横盘”和“未取得数据”。SSD 只采用当前 2TB 规格的全网比价栏,不采用跨容量聚合的“¥819 起”。

中国大陆六类 PC 硬件公开价格事件

类别 10 月 1 日可复核价 30 日窗口内真实走势 建议
CPU Ryzen 7 9800X3D,京东 ¥2,699 9/3 ¥2,599 → 9/9 ¥2,449 → 9/23–24 ¥2,579 → 9/30 ¥2,679 → 10/1 ¥2,699 观望;连续两次上行,较窗口低点高 10.21%
GPU MSI RTX 5070 VENTUS 3X 12G,亚马逊中国 ¥4,464.34 9/7–10/1 多次实时复核均为 ¥4,464.34 刚需可比价后入手;单一渠道横盘不等于全市场没有促销
主板 ASUS TUF B850M-PLUS WIFI7,天猫 ¥1,299 9/2–10/1 多次复核均为 ¥1,299 刚需可入;公开最低价稳定,但下单前核对店铺与售后
DRAM 暂无报价;最后可复核 9/9 ¥3,900 9/2 ¥3,900 → 9/5 ¥3,860 → 9/6–9/9 ¥3,900 观望;固定 SKU 缺价,不用其他容量、颗粒或时序替代
HDD IronWolf Pro 8TB ST8000NE001,i百联 ¥1,849 9/2–10/1 多次复核均为 ¥1,849 容量刚需可买;先核对型号、五年保修与数据恢复服务
SSD ZHITAI Ti600 2TB,京东 ¥1,799 9/2 ¥1,919 → 9/23–10/1 ¥1,799 观望或确认结算价后入手;可比价下降 6.25%,但聚合栏可能滞后

价格来源: 9800X3D、MSI RTX 5070 VENTUS 3X、ASUS TUF B850M-PLUS WIFI7、Kingston FURY DDR5-6000 32GB、IronWolf Pro 8TB、ZHITAI Ti600 2TB。

判断依据

CPU 是今天唯一变价 SKU,公开最低报价从 ¥2,679 上升到 ¥2,699,单日上涨 0.75%,连续两次采样上行;没有数据支持“继续下跌”。GPU、主板、HDD 与 SSD 只是同一公开渠道再次横盘,不能外推为整个中国零售市场稳定。SSD 页面头部显示跨容量聚合的“¥819 起”,但 2TB 当前规格的全网比价仍为 ¥1,799,两种口径不能混用。DRAM 固定 SKU 继续缺价。本期购买建议只依据可复核价格序列,不引用未核实的新品或产能传闻。

其它你可能关心的

本期结论

两篇材料都在修复“通用边界成本”:C2 的方法边界迫使向量值落到堆上,BTree 的节点导航边界让绝大多数同节点步进也走完整状态机。前者通过有边界的内联豁免把四参数分配从 192 B/call 降到零;后者用 cursor 索引不变量把主要迭代 microbenchmark 缩短 50.3%–73.8%。但两者都展示了不能省略的代价面:Vector 补丁尚无吞吐与代码体积数据,BTree 补丁有个别 microbenchmark 和最大 RSS 回退。真正可迁移的方法不是“总是内联”或“总是写 unsafe”,而是先证明常见路径的边界何时多余,再用独立限额与回退路径约束优化范围。