本期检索说明
先读取 content/collections/deep-radar 截至 2026-09-18 的全部原文链接,并按 URL、标题与实现机制去重。最近 24 小时内,OpenJDK x86 C2 的 FP16 广播补丁给出了明确的旧、新指令序列和带误差的 JMH 结果;Rust VecDeque 克隆补丁同时给出通用类型的资源复用、TrivialClone 特化、环形缓冲区源码实现和 8 组主 benchmark。两项均满足实测数据、源码/指令级证据、原理剖析与工程迁移价值四项要求。
Kotlin 当日候选主要是正确性修复或 IR API 重构,没有性能实测;Zig 公开仓库迁移后没有形成三项证据闭环的新材料;Linux 新提交也没有找到同时提供可复现实测与源码级机制说明的候选,因此不凑数。两篇入选补丁截至截稿均仍处于开放评审状态,结果来自单一硬件,正文保留这一限制。
| 主题 | 原始发布日期 | 一手来源与交叉验证 | 截稿状态 | 推荐强度 |
|---|---|---|---|---|
HotSpot x86 ReplHF_reg 单指令广播 |
2026-09-18 12:29(中原标准时间) | OpenJDK PR #32938 / x86 AD 规则与 assembler / 随补丁 JMH | Open,等待 2 位 reviewer | 必读 |
Rust VecDeque::clone(_from) 优化 |
2026-09-19 06:00(中原标准时间) | rust-lang/rust PR #162991 / alloc 源码与测试 / 8 组 benchmark | Open,等待 libs team 评审 | 必读 |
01 · HotSpot:让 FP16 广播直接从 XMM 进入向量寄存器
原文与日期: Jatin Bhateja,2026-09-18 12:29(中原标准时间);OpenJDK PR #32938 与 JDK-8392548。截稿时补丁修改 3 个文件,增加 95 行、删除 7 行,仍在等待 HotSpot reviewer。
为什么值得读: 这不是“换一条更快的指令”这么简单,而是一个典型的 C2 指令选择问题:Java Vector API 的 FP16 replicate 已经把源值放在 XMM 寄存器,旧 AD 规则却先用 evmovw 把 16 位值搬到通用寄存器,再调用整数源版本的 evpbroadcastw。在支持 AVX512-FP16 的机器上,这次跨寄存器文件搬运约有 3 周期延迟,而且还占用一个临时 GPR。
核心技术结论: AVX512BW 的 vpbroadcastw 可以直接接受 XMM 源操作数。补丁因此从 ReplHF_reg 删除 rRegI rtmp 与 TEMP effect,让 matcher 生成一条 XMM→向量广播;assembler 的能力断言也细化为:512 位向量要求 AVX512BW,较短向量沿用 AVX2。
// 旧路径
__ evmovw($rtmp$$Register, $src$$XMMRegister);
__ evpbroadcastw($dst$$XMMRegister, $rtmp$$Register, vlen_enc);
// 新路径
__ vpbroadcastw($dst$$XMMRegister, $src$$XMMRegister, vlen_enc);这类改动的迁移价值在于:机器描述规则不应只验证“指令可用”,还要核对源操作数已经位于哪个寄存器文件。若 ISA 有直接的 reg-reg 形式,额外 move 同时增加延迟、寄存器压力和调度依赖;删除临时 operand 也会给全局寄存器分配留下更多空间。
最有价值的实验、源码、benchmark 与指令细节: 随补丁新增的 ReplHFRegBenchmark.manyBroadcasts 每轮处理 512 组数据,每个内层元素执行 16 次 FP16 加法,强制产生大量 replicate。JMH 采用吞吐模式、5 次测量:
| 版本 | 吞吐 | 误差 | 变化 |
|---|---|---|---|
| 基线 | 16.587 ops/ms | ±0.041 | — |
| 单指令广播 | 16.978 ops/ms | ±0.033 | +2.36% |
2.36% 与作者概括的 2–3% 一致,而且误差区间没有重叠。源码证据也闭环:x86.ad 删除 XMM→GPR 的 evmovw,assembler_x86.cpp 放宽 XMM 源 vpbroadcastw 的 AVX512BW 断言,JMH 则专门构造高密度广播。边界同样明确:收益只适用于支持 AVX512-FP16 与 AVX512BW 的 x86 目标;benchmark 是人为放大 broadcast 密度的微基准,不能外推为任意 Java 工作负载都快 2.36%。PR 尚未给出具体 CPU 型号、反汇编全文或应用级结果。
适合的工程师背景: 熟悉 C2 Ideal/ADLC、Vector API、x86 EVEX 编码或寄存器分配,希望理解一条机器描述规则如何把 Java FP16 操作映射到实际指令的 JVM 工程师。
预计阅读收益: 约 35–55 分钟;可以掌握从 matcher operand、temporary effect、assembler feature gate 到 JMH 的完整排查链,并学会优先寻找不必要的跨寄存器文件搬运。
02 · Rust:VecDeque 克隆不再丢掉可复用的元素分配
原文与日期: François Bernier,2026-09-19 06:00(中原标准时间);rust-lang/rust PR #162991。补丁修改 4 个文件,增加 479 行、删除 10 行;主要新增量是环形布局、panic、ZST 与 drop 语义测试,截稿时仍在等待 libs team 评审。
为什么值得读: VecDeque::clone_from 文档承诺尽量避免重新分配容器缓冲区,但 2022 年一次重写后,当前实现先 clear(),再对源元素逐个 clone()。这会把目标端已有 String、Vec 等元素的内部 allocation 全部丢掉,错过 T::clone_from 本来提供的资源复用。与此同时,对 u64 这类按位复制即可完成克隆的类型,迭代器逐元素路径又比直接拷贝两个底层 slice 更重。
核心技术结论: 新实现通过内部 SpecCloneFrom 分成两条路径。通用 T: Clone 先把目标截断到源长度,再同时遍历源、目标各自最多两个 slice;重叠部分调用 clone_from_slice,剩余源元素才 clone() 追加。T: TrivialClone 则清空目标、一次 reserve,然后对源的 front/back slice 执行两次 ptr::copy_nonoverlapping,最后把 head 归零并设置长度。
self.truncate(source.len());
// 重叠区:复用 String/Vec 等元素自己的 allocation
dst.clone_from_slice(src);
// 只有源的尾部需要新建元素
self.extend(src_front.iter().chain(src_back).cloned());环形缓冲区的难点不是复制本身,而是源和目标可能在不同位置 wrap。补丁用两个 slice 的小型状态机逐段对齐,避免先 make_contiguous() 搬动数据。TrivialClone 特化则把环形源的两个物理片段压到目标缓冲区起点;unsafe 前置条件由独立 allocation、reserve 后容量、ZST 的零字节 copy 和最终长度更新共同保证。
最有价值的实验、源码与 benchmark 细节: 作者在 AMD Ryzen 9 5950X 上测量 ns/iteration:
| Benchmark | main |
补丁 | 变化 |
|---|---|---|---|
clone_u64_contiguous |
136.32 ns | 85.06 ns | -37.6% |
clone_u64_wrapped |
134.67 ns | 85.02 ns | -36.9% |
clone_from_u64_contiguous |
112.64 ns | 58.04 ns | -48.5% |
clone_from_u64_wrapped |
112.59 ns | 59.32 ns | -47.3% |
clone_from_string_contiguous |
20,432.14 ns | 4,479.83 ns | -78.1% |
clone_from_string_wrapped |
20,408.74 ns | 4,310.88 ns | -78.9% |
负向结果很重要:普通 clone_string_contiguous 从 20,141.18 ns 变成 20,706.59 ns,慢 2.8%,因为全新 clone 没有目标元素可复用,却仍承担新的分派/布局成本。clone_u64_small_wrapped 在整套 benchmark 中看似慢 19.8%,单独运行却是 15.73 → 15.52 ns(快 1.3%);作者据此判断可能是代码布局或 glibc 干扰。这个反差提醒我们:十几纳秒的小样本必须做隔离复测,不能只看一次套件结果。
测试覆盖比性能数字更有工程价值:补丁验证目标容量复用、源/目标不同 wrap 点、扩容后追加、目标截断、32 字节对齐元素、ZST、自定义 Clone、带 Drop 的 TrivialClone,以及克隆中途 panic 后不泄漏、不 double-drop。限制也很清楚:数据来自单台 5950X,没有 allocator 计数或多平台置信区间,且 TrivialClone 仍是内部不稳定能力;因此最可靠的结论是“资源复用路径显著受益,普通 clone 和小容器仍需继续调优”。
适合的工程师背景: 熟悉 Rust alloc、环形缓冲区、specialization、unsafe 初始化状态或容器异常安全,希望优化集合复制而不破坏 drop/panic 语义的库工程师。
预计阅读收益: 约 60–90 分钟;可以掌握环形布局的分段 clone、元素内部 allocation 复用、平凡复制特化,以及如何为 unsafe 快路径设计覆盖 panic 与析构的测试矩阵。
中国大陆 ToC 硬件价格观察
数据口径
窗口为 2026-08-21 至 2026-09-19,单位人民币,六类硬件继续固定同一 SKU。9 月 19 日重新读取 9800X3D 固定样本页时,页面显示京东最低 ¥2,619,与 9 月 17 日相同,因此新增一个真实横盘点。GPU、主板、DRAM、HDD、SSD 固定页面均未能在本次采集稳定返回可核验报价,不复制旧值冒充今日数据;折线尾部空白表示证据缺失,不代表价格横盘。
| 类别 | 固定样本与最后可复核价 | 30 日窗口内真实走势 | 建议 |
|---|---|---|---|
| CPU | Ryzen 7 9800X3D,9/19 ¥2,619 | 8/21 ¥2,609 → 9/9 ¥2,449 → 9/14 ¥2,639 → 9/15、9/17、9/19 ¥2,619 | 观望;较 9/9 低点仍高 6.94%,但最近三个真实点横盘 |
| GPU | MSI RTX 5070 VENTUS 3X 12G,最后可核验 9/13 ¥4,464.34 | 8/29–9/13 六个真实点均为 ¥4,464.34,之后无新点 | 继续观望;样本已延迟 6 天,下单前重核渠道价 |
| 主板 | ASUS TUF B850M-PLUS WIFI7,最后可核验 9/8 ¥1,299 | 8/31 ¥1,449 → 9/2–9/8 ¥1,299 | 刚需可关注 ¥1,299;当前样本过期,不据此外推 |
| DRAM | Kingston FURY Beast DDR5-6000 32GB,最后可核验 9/9 ¥3,900 | 9/2 ¥3,900 → 9/5 ¥3,860 → 9/6–9/9 ¥3,900 | 观望;缺少 10 天内的新点,不能确认零售趋势 |
| HDD | IronWolf Pro 8TB ST8000NE001,最后可核验 9/10 ¥1,849 | 9/1–9/10 五个真实点均为 ¥1,849 | 按容量刚需购买;优先比较五年保修与数据恢复服务 |
| SSD | ZHITAI Ti600 2TB,最后可核验 9/10 页面最低 ¥749 | 9/2 ¥1,919 → 9/5–9/10 ¥749;同页渠道价差异常大 | 仅在确认 2TB 规格、颗粒、商家与保修后考虑 |
价格来源: 9800X3D、MSI RTX 5070 VENTUS 3X、ASUS TUF B850M-PLUS WIFI7、Kingston FURY DDR5-6000 32GB、IronWolf Pro 8TB、ZHITAI Ti600 2TB。
判断依据
CPU 的同渠道最低报价连续三次为 ¥2,619,短期可以称为样本横盘,但它仍比 9 月 9 日的窗口低点高 ¥170;非刚需不必追价。其余五类末点延迟 6–11 天,只作为历史参照。SSD 的 ¥749 继续视为需要核验规格和渠道的异常事件,不能外推为 2TB SSD 全市场价格。
其它你可能关心的
- rustc:优先运行 dropck 而不是 drop-liveness——主样本指令数平均改善 0.2%,但 secondary 最多回退 2.8%、一个主样本 RSS 回退 3.8%,仍在处理性能回归。
- OpenJDK:AVX10.2 恢复两步 FP16→整数转换——源码与 JMH 已更新,但 PR 尚未公开量化结果,本期不入选。
- Kotlin/Native 与 Wasm:修正 roundToInt/Long 精度边界——正确性证据充分,但没有性能实测。
本期结论
两项优化都说明,容器或编译器热路径中的“多余中间态”值得优先消除:C2 删除 XMM→GPR 的寄存器中转,VecDeque 删除“先销毁再重建”的元素生命周期中转。前者减少指令和临时寄存器,后者保留对象内部 allocation,并对可按位复制的类型降为两个 slice copy。真正可迁移的方法不是只追主结果,而是同时检查适用 ISA、环形布局、panic/drop 语义和负向小样本。