本期检索说明
先读取 content/collections/deep-radar 的全部历史原文链接,并按 URL、标题与实现机制去重。本期检索窗口为 2026-10-19 至 2026-10-25;最终收录 Linux、Kotlin/Native、Java/JVM 各 1 篇一手材料。三篇均同时给出可核验的实测数据、源码或指令级证据、原理解释与工程迁移价值,且未在既往报告出现。
Rust 本周较醒目的 SyntaxContext niche 实验经官方 rustc-perf 判定“无相关变化”;另一项冷路径 outlining 草案由 LLM 生成且仍有 CI/LLVM API 问题。Zig 本周没有找到同时满足三项证据红线的新材料,因此不为凑数收录。Linux VSwap 的第 12 个 VM_SPARSE RFC 补丁尚未跑正式 benchmark,文中所有性能结论严格限定于已测试的 xarray 设计。
| 主题 | 原始发布日期 | 一手来源与交叉验证 | 截稿状态 | 推荐强度 |
|---|---|---|---|---|
| Linux Virtual Swap Space v6 | 2026-10-21 14:03(中原标准时间) | LKML cover letter / 12 个源码补丁 / LWN 邮件镜像 / 生产与半合成 benchmark | v6 开放评审;第 12 补丁仍为 RFC | 强烈推荐,重点看虚拟槽与物理后端的解耦边界 |
| Kotlin/Native cache class fields | 2026-10-23 18:53(中原标准时间) | Kotlin PR #9233 / 单文件源码 diff / 324 项测试 / 字节级输出对照 | 开放 PR,尚未合并 | 强烈推荐,典型的隐藏二次复杂度排查 |
HotSpot AArch64 SVE String.indexOf |
2026-10-21 21:11(中原标准时间) | OpenJDK PR #33493 / JBS / Webrev / C2 AD 规则与 MacroAssembler / 两代 Neoverse JMH | 开放评审,尚缺 2 名 reviewer | 推荐,但必须同时阅读回退样本 |
01 · Linux VSwap:让页表槽位不再等同于物理 swap 槽
原文与日期: Nhat Pham,2026-10-21 14:03(中原标准时间);LKML v6 cover letter、LWN 邮件镜像与完整线程。系列共 12 个补丁、修改 26 个文件,增加 2,291 行、删除 293 行。
为什么值得读: 传统 swap entry 同时承担页表标识、swap cache key、cgroup 索引与磁盘槽地址;这在“交换等于落盘”时很高效,却迫使只驻留 zswap、零页或 cache-only folio 的页面也预占物理 swap 槽。VSwap 把 PTE 中的虚拟槽与实际后端拆开,使 zswap 可以动态增长、按需落盘,又不在后端迁移时扫描 PTE/rmap。这是一篇少见的、同时覆盖数据结构、并发同步、cgroup 记账和生产 A/B 的内存管理材料。
核心技术结论: 启用 vswap=on 后,可交换匿名页先从特殊虚拟设备取得槽位;每个动态 cluster 在原有 swap_cluster_info 外增加 virtual_table。表项低 3 位编码后端类型:000 表示尚无独立后端,001 指向 zswap_entry,010 保存物理 swap 的 type/offset。物理 cluster 中的 VSwap 标记反向指回虚拟 entry,因此 zswap writeback 迁移到磁盘时无需修改页表。后端切换继续由 swap cache 与 folio lock 串行化;cgroup v2 的 memory.swap.current 只在虚拟 entry 真正获得物理槽时计费。
struct swap_cluster_info_dynamic {
struct swap_cluster_info ci;
unsigned int index;
struct rcu_head rcu;
atomic_long_t *virtual_table; /* 8 bytes per slot */
};
/* low three bits: NONE=000, ZSWAP=001, SWAPFILE=010 */最有价值的实验、源码与 benchmark 细节: x86-64、52 核、zstd zswap 环境中,memhog 在 16GB RAM 上单线程分配 48GB,20 轮均值从 124.05±11.64s 降到 118.57±15.68s(-4.4%);剔除最好与最差轮后为 123.75±10.39s → 116.06±8.22s(-6.2%),但方差仍然很大。usemem 在 32GB RAM 上分配 56GB、16 轮,吞吐只提高 1.0%,而 free 阶段从 7669±146ms 降到 6439±111ms(-16.0%)。52 worker、memory.max=3GB 的内核构建则揭示代价:VSwap on 的 wall time 165.58±0.45s → 166.01±0.58s(+0.3%),system time +1.6%;补丁存在但关闭时 system time甚至 +2.4%。Instagram django A/B 报告吞吐持平、请求延迟降低约 1–3%,并消除 zswap 用户的 swapfile 占用,但未公开原始样本量。最重要的边界是:上述数字来自 xarray 版本,第 12 个 VM_SPARSE 替代实现只做过简单 stress test,不能继承这些性能结论。
适合的工程师背景: 熟悉 Linux MM、zswap、swap cache、folio lock、memcg/cgroup v2,或正在设计压缩内存、分层内存与无盘设备内存回收的内核工程师。
预计阅读收益: 约 75–100 分钟;能理解如何在不扫描页表的前提下虚拟化 swap 地址空间、如何编码双向映射与同步边界,以及为什么“关闭功能不回退”也必须进入验收矩阵。
02 · Kotlin/Native:删除已经不影响输出的 proto 遍历
原文与日期: JetBrains Kotlin 团队,2026-10-23 18:53(中原标准时间);Kotlin PR #9233、KT-90643 对应源码 diff 与引入历史行为的 commit 873df4c。
为什么值得读: 性能问题不在序列化本身,而在一段“看似只做校验”的遗留路径:buildSerializedClassFields 为每个嵌套类重新反序列化顶层声明,再沿父类 proto 找回目标类并扫描字段。自 KT-52512 之后,这些中间结果没有任何一个进入最终输出,却仍让包含大量嵌套模型的 cache build 变成二次复杂度。补丁只删一个文件中的 48 行左右代码,却获得数量级收益。
核心技术结论: 真实输出的 SerializedClassFields 已经来自 IR 中的 fields,ClassFieldsDeserializer 又按索引而非字段名匹配;因此 proto 字段重名检查、父 proto 的 findClass 以及从 outer proto 解码 thisReceiver 都不再提供语义保障。保留 getFileDeserializationState(signature.topLevelSignature()) 获取文件引用,并依靠现有 require(irClass.isInner) 守住 inner-class 不变量即可。
// 旧路径:每个 nested class 都从 top-level declaration 重新下钻
- val protoDeclaration = fileReader.declaration(declarationIndex)
- var protoClass = protoDeclaration.irClass
- protoClass = protoClass.findClass(...)
- protoClass.declarationList.forEach { /* collect proto fields */ }
// 新路径:输出只使用 IR fields,proto walk 整段删除
val fileDeserializationState =
deserializer.getFileDeserializationState(signature.topLevelSignature())最有价值的实验、源码与 benchmark 细节: 一个包含 2,000 个 nested models 的类,Kotlin/Native cache build 从 141s 降到 11s,约 12.8 倍,耗时减少 92.2%。作者没有只用时间证明等价:195 个 box tests 分别以 STATIC_EVERYWHERE 与 STATIC_PER_FILE_EVERYWHERE 运行,另跑 129 个 cache tests;相同 klib 的 class_fields 以及其余 IR cache 文件均与 master 字节级一致。源码 diff 还能直接看到 BinaryNameAndType、ProtoField、fileReader、symbolDeserializer 与整个 protoFieldsMap 被删除,证据与复杂度解释完全对齐。
适合的工程师背景: 熟悉 Kotlin/Native、KLIB/IR serialization、编译缓存,或正在排查编译器前后端中“重复解析 + 嵌套结构”导致的规模化退化的工程师。
预计阅读收益: 约 35–50 分钟;能学会从“某项校验是否仍影响产物”反向做数据流审计,并用字节级产物对照为删代码型性能优化建立强证据。
03 · HotSpot SVE String.indexOf:先筛首尾字符,再验证候选
原文与日期: Nick Gasson / Arm,2026-10-21 21:11(中原标准时间);OpenJDK PR #33493、JDK-8393101 与 Webrev 00。
为什么值得读: 这不是简单把 NEON 换成更宽的寄存器。实现必须兼容 Latin1、UTF-16 与 UTF-16 haystack/Latin1 needle 混合编码,处理任意 needle 长度、尾向量 predicate、多候选冲突和等长字符串快路;同时两代 Neoverse 对同一组 JMH 的响应差异巨大,正好展示可伸缩向量代码为何不能只报最好数字。
核心技术结论: C2 在 UseSVE > 0 时选择新的 string_indexof{LL,UL,UU}_sve AD 规则。MacroAssembler 先广播 needle 的首尾字符,对 haystack 两个对应窗口分别执行 sve_cmp,再以 sve_ands 只保留同时命中的 lane;sve_brkb 与 sve_cntp 找出最低候选,随后用 predicated load 逐向量验证整个 needle。失败时用 sve_brka/sve_bics 清掉已经验证的候选并继续;长度为 1 则回退现有 string_indexof_char_sve。
sve_cmp(EQ, pred_first, variant, active, haystack_vec, first_needle_vec);
sve_cmp(EQ, pred_last, variant, active, haystack_last_vec, last_needle_vec);
sve_ands(pred_first, active, pred_first, pred_last);
sve_brkb(lowest, active, pred_first, false);
sve_cntp(lane_offset, variant, lowest, lowest);最有价值的实验、源码与 benchmark 细节: PR 以 commit 64e0cf4 为基线运行 TEST="micro:IndexOf.*",表中 delta 是 avgt ms/op 倍数,越低越好。successBig 在 Neoverse V2/V3 分别为 0.391×/0.376×,即约 2.56/2.66 倍加速;V3 的 searchHugeLargeSubstringNoMatch 为 0.023×(约 43.5 倍),UTF-16 版本 0.029×(约 34.5 倍)。但 V2 的同一无匹配用例只有 0.457×,而 searchHugeMiddleMatch 反而为 2.112×(慢 111.2%);V3 的 search16HugeNoMatch 为 1.456×(慢 45.6%),短 substring 也有约 7–8% 回退。工程结论不是“SVE 必然更快”,而是首尾过滤对长 needle 和拒绝型输入非常有效,候选密度、微架构与尾部路径决定回退风险。
适合的工程师背景: 熟悉 HotSpot C2 matcher、AArch64 SVE predicate、Compact Strings,或在 JVM/标准库中维护 SIMD 字符串搜索 intrinsic 的工程师。
预计阅读收益: 约 60–80 分钟;能掌握可伸缩向量字符串搜索的候选生成/验证结构、混合编码加载方式,以及用完整矩阵而非峰值加速判断是否值得合入。
中国大陆 ToC 硬件价格观察
数据口径
窗口为 2026-09-26 至 2026-10-25,单位人民币,六类硬件固定同一 SKU。今天复核到 CPU、主板、HDD 与 SSD 四个当前规格报价;GPU 与 DRAM 页面均显示“暂无报价”,因此不新增点,也不把 10 月 18 日或 9 月 9 日的旧价复制到今天。CPU 采用当前规格全网最低 ¥2,591.10;主板采用当前规格 ¥1,349,不使用其他 B850/B650 型号的系列起价;SSD 只记录 Ti600 2TB 的 ¥1,797。
| 类别 | 10 月 25 日可复核价 | 30 日窗口内真实走势 | 建议 |
|---|---|---|---|
| CPU | Ryzen 7 9800X3D,京东 ¥2,591.10 | 窗口 ¥2,591.10–2,699;较 10/19 的 ¥2,609 再降 ¥17.90,并刷新本窗口低点 | 可入手;已到窗口低位,但降幅很小,仍建议比价券后价 |
| GPU | 今日暂无报价;最后可复核 10/18 ¥4,464.34 | 9/26–10/18 可见样本均为 ¥4,464.34,之后缺价 | 观望;页面断价不能解释为横盘或涨跌 |
| 主板 | ASUS TUF B850M-PLUS WIFI7,当前规格 ¥1,349 | 当前规格 10/15–19 为 ¥1,298,今日上涨 ¥51;窗口中的 ¥1,169 是其他规格系列价 | 观望;先核对完整型号,当前规格较上次采样高 3.9% |
| DRAM | 暂无报价;最后可复核 9/9 ¥3,900 | 本 30 日窗口没有同 SKU 可比点 | 观望;不以 64GB、DDR4 或其他时序替代固定 32GB C30 套条 |
| HDD | IronWolf Pro 8TB ST8000NE001,京东 ¥3,550 | 9/26–10/15 为 ¥1,849,10/16 起可见渠道变为 ¥3,550;今日仍持平 | 继续观望;更像低价渠道退出,不能据单页推断行业涨价 |
| SSD | ZHITAI Ti600 2TB,京东 ¥1,797 | 窗口 ¥1,699–1,799;较 10/19 的 ¥1,699 上涨 ¥98,接近上沿 | 观望;双 11 前已回到窗口高位,等待可复核促销价 |
价格来源: 9800X3D、MSI RTX 5070 VENTUS 3X、ASUS TUF B850M-PLUS WIFI7、Kingston FURY DDR5-6000 32GB、IronWolf Pro 8TB、ZHITAI Ti600 2TB。
判断依据
本期建议只依赖固定 SKU 的公开可见价格与 30 日样本,不加入无法核实的新品或原厂产能传闻。CPU 已是窗口低点,适合有明确装机需求者入手;SSD 与主板较上次采样反弹,且临近集中促销窗口,继续观望的机会成本较低。HDD 的跳变由可见渠道切换造成,GPU、DRAM 又缺少今天报价,均不足以推导整个品类趋势。
其它你可能关心的
- OpenJDK:RISC-V C2 为 VectorSlice 增加 RVV
vslidedown/vslideup规则 - Rust:移除 SyntaxContext niche 的 rustc-perf 实验
- Rust:MIR/LLVM 冷 panic 与 drop 路径 outlining 草案
本期结论
三篇材料的共同点是先辨认“身份”与“载体”是否被错误绑在一起:VSwap 把页表身份从物理后端解耦,Kotlin/Native 把真实 IR 输出从已经失效的 proto 校验解耦,SVE indexOf 把廉价候选筛选与昂贵全串验证解耦。迁移到工程实践时,还要保留三类反证:关闭路径是否仍有成本、产物是否逐字节等价,以及不同微架构/输入分布是否出现回退。