本期检索说明
先读取 content/collections/deep-radar 截至 2026-10-06 的全部原文链接,并按 URL、标题与实现机制去重。最近 24 小时找到两项同时满足实测、源码证据和原理剖析的一手工程材料:Kotlin linker 避免为了判断声明种类而反序列化完整 protobuf;rustc 在普通非增量、非 profiling 构建中不再维护从未读取的 VecCache::present。Java/JVM、Zig 与 Linux 的新候选没有同时达到三条证据红线,本期不凑数。
Kotlin 改动已合入,数据来自一个真实项目里单个热点函数的测量;Rust 改动截稿时仍在开放评审,benchmark 使用了临时修改过的 perf collector,才能模拟不带 -Zincremental-verify-ich 的普通全量构建。本文评价公开 patch、评审与可追溯数字,不把热点函数提速写成整编译提速,也不把单个大型 crate 的 RSS 降幅外推到所有项目。
| 主题 | 原始发布日期 | 一手来源与交叉验证 | 截稿状态 | 推荐强度 |
|---|---|---|---|---|
| Kotlin linker protobuf 标签快读 | 2026-10-06 17:43(中原标准时间) | Kotlin PR #8721 / 完整 patch / reviewer 性能追问 / 真实项目测量 | 已于 2026-10-07 01:59 合入 | 强烈推荐,重点看 protobuf wire tag 如何替代完整对象构造 |
rustc VecCache::present 按模式关闭 |
2026-10-07 06:35(中原标准时间) | Rust PR #163906 / query cache patch / DHAT / Max-RSS / 指令计数 | 开放评审 | 强烈推荐,重点看辅助索引的读写生命周期审计 |
01 · Kotlin:只问声明类型,就不该反序列化整棵 protobuf
原文与日期: Ivan Kylchik(ivandev0),2026-10-06 17:43(中原标准时间);Kotlin PR #8721、完整源码 patch 与 性能评审记录。
为什么值得读: Kotlin linker 有时只拿到 signature,需要判断目标究竟是函数还是属性。旧路径调用 libraryFile.declaration(index),把整条 IR declaration protobuf 解码成对象,再读取 declaratorCase;所需信息其实就在 message 的第一个 wire tag。这个补丁把“需要一个枚举值”和“构造完整声明对象”分离,是编译器、索引器和 RPC 系统都能迁移的懒解析案例。
核心技术结论: 新的 declarationKind(index) 直接取得 declaration 的 CodedInputStream,只执行一次 readTag(),再把字段号对应到 ProtoDeclaration.DeclaratorCase。protobuf tag 同时编码字段号和 wire type;这里各 declaration 变体都是 length-delimited 字段,因此首个 tag 足以区分 anonymous initializer、class、constructor、function、property 等类型,无须解析字段内容、分配完整 proto 对象或递归构造子消息。
val input = bytesSource.irDeclaration(index).codedInputStream
return when (input.readTag()) {
18 -> IR_CLASS
50 -> IR_FUNCTION
58 -> IR_PROPERTY
98 -> IR_TYPE_ALIAS
else -> null
}调用点从 libraryFile.declaration(index).declaratorCase 改为 libraryFile.declarationKind(index);Kotlin/Native 的 signatures-only 实现则显式报错,避免在没有 declaration bytes 的后端上悄悄伪造语义。这个接口边界比“在旧解析器里加缓存”更干净:调用者只能索取所需的轻量信息。
最有价值的实验、源码与 benchmark 细节: reviewer 追问保留 ByteArray、索引查找和 CodedInputStream 后是否真有收益,作者随后在真实 animeko 项目测量 getAllMatchingSignatures:改动前约 7.5 s,改动后约 400 ms,热点耗时减少约 94.67%,或约 18.75 倍。作者还说明 prefix 信息只读取一次并缓存;这意味着剩余的索引与流包装成本没有重新落到每次匹配上。
这个数字证明“完整 protobuf 反序列化”确实是主导成本,但证据边界也很明确:公开记录只有一个项目与一个函数级耗时,没有误差区间、整次构建时间或分配剖面。因此能下的结论是该 linker 热点被数量级消除,而不是 Kotlin 编译整体提速 18.75 倍。
适合的工程师背景: 熟悉 Kotlin IR、KLIB/linker、protobuf wire format,或在编译器与索引服务中处理大批序列化元数据的工程师。
预计阅读收益: 约 25–40 分钟;能学到如何把“完整反序列化”降为“判别字段快读”、如何让后端能力通过接口暴露,以及如何用 reviewer 的性能追问约束一个看似显然的优化。
02 · rustc:辅助索引若只在增量与 profiling 中读取,就不应在普通构建里持续写
原文与日期: Josh Triplett(joshtriplett),2026-10-07 06:35(中原标准时间);Rust PR #163906 与 完整源码 patch。
为什么值得读: rustc 的 VecCache 除主 buckets 外,还维护一套 present bucket,用于枚举已写入的 query key。普通非增量、非 profiling 的 release 构建不会读取它,却仍为每个新缓存项写入、扩容并占用页。这个 PR 从“谁真正消费辅助结构”反向设计启用条件,比单纯换容器更有工程价值。
核心技术结论: patch 增加 track_present: bool 与 without_track_present(),只有在 incremental、-Zincremental-verify-ich、self-profiling 或 debug assertions 任一启用时才维护 present。插入路径从无条件更新第二张表,变成只有新槽位且 track_present 时才写;for_each 与 len 在关闭跟踪时直接断言,防止未来调用者把“省略索引”误当成完整缓存。
let track_present = incremental
|| sess.opts.unstable_opts.incremental_verify_ich
|| sess.prof.enabled()
|| cfg!(debug_assertions);
if slot_idx.put(&self.buckets, value, index.index() as u32)
&& self.track_present
{
self.present.insert(index, ());
}这里可迁移的原则是:辅助索引的开关必须由其所有消费者共同决定,并在关闭状态给遍历 API 加硬断言。否则一次“省内存”很容易在少见模式下变成漏项或错误增量结果。
最有价值的实验、源码与 benchmark 细节: 作者临时修改 perf collector,让 full builds 不再自动携带 -Zincremental-verify-ich,从而测到真实生产模式。aws-sdk-ec2 1.175.1 的 full check 最大 RSS 减少 62.6 MiB,约 1.13%。三个公开样本同时给出 DHAT peak 与 Max-RSS:cargo 分别减少 4.7 MiB(0.74%)和 2.6 MiB(0.30%);image 减少 2.3 MiB(1.73%)和 1.50 MiB(0.53%);ripgrep 减少 2.02 MiB(3.22%)和 1.10 MiB(0.55%)。指令计数均为边际改善,但公开描述没有足够精确数值,本文不把它包装成确定的 CPU 提速。
DHAT 与 Max-RSS 不一致正是这组实验的价值:前者更接近 allocator 看到的 live heap,后者只统计实际触碰并驻留的页,还混入编译器其他内存。不同 crate 的 query 数量、bucket 扩容点与页触碰密度不同,所以节省不会按源码规模线性变化。aws-sdk-ec2 的 62.6 MiB 是大型全量 check 的上限样本,不是普遍比例。
证据限制包括:PR 尚未合入;perf collector 为实验临时修改;关闭路径只覆盖普通非增量、非 profiling、release-like 构建,增量验证、自剖析和 debug 仍会维护 present。这些限制反而让改动值得读——它展示了如何在保住可观测性与正确性工具的同时,只优化真正无需辅助索引的模式。
适合的工程师背景: 熟悉 rustc query system、增量编译、编译器内存剖析,或维护带可选观测索引的大型缓存系统的工程师。
预计阅读收益: 约 30–45 分钟;能掌握辅助数据结构的消费者审计、模式化启用条件、DHAT 与 RSS 的口径差异,以及如何为“关闭维护”补上防误用断言。
中国大陆 ToC 硬件价格观察
数据口径
窗口为 2026-09-08 至 2026-10-07,单位人民币,六类硬件固定同一 SKU。今天通过公开比价页的实时渲染结果复核到 CPU、GPU、主板、HDD、SSD 五类报价;五类均与昨日相同。DRAM 页面仍明确显示“暂无报价”,因此不新增点。重复价格作为真实采样保留,用来区分“已复核横盘”和“未取得数据”。SSD 只采用当前 2TB 规格的全网比价栏,不采用跨容量聚合的“¥819 起”。
| 类别 | 10 月 7 日可复核价 | 30 日窗口内真实走势 | 建议 |
|---|---|---|---|
| CPU | Ryzen 7 9800X3D,京东 ¥2,699 | 9/9 ¥2,449 → 9/30 ¥2,679 → 10/1 ¥2,699 → 10/2–3 ¥2,694 → 10/4–7 ¥2,699 | 观望;处于窗口高位,较 9/9 低点高约 10.2% |
| GPU | MSI RTX 5070 VENTUS 3X 12G,亚马逊中国 ¥4,464.34 | 9/8–10/7 多次实时复核均为 ¥4,464.34 | 刚需可比价后入手;单一渠道横盘不等于全市场没有促销 |
| 主板 | ASUS TUF B850M-PLUS WIFI7,天猫 ¥1,299 | 9/8–10/7 多次复核均为 ¥1,299 | 刚需可入;公开最低价稳定,但下单前核对店铺与售后 |
| DRAM | 暂无报价;最后可复核 9/9 ¥3,900 | 9/8–9/9 ¥3,900 | 观望;固定 SKU 缺价,不用其他容量、颗粒或时序替代 |
| HDD | IronWolf Pro 8TB ST8000NE001,i百联 ¥1,849 | 9/8–10/7 多次复核均为 ¥1,849 | 容量刚需可买;先核对型号、五年保修与数据恢复服务 |
| SSD | ZHITAI Ti600 2TB,京东 ¥1,799 | 9/23–10/7 多次复核均为 ¥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。
判断依据
CPU 连续四天为 ¥2,699,仍处本窗口高位;相对 9 月 9 日低点 ¥2,449 已反弹 ¥250、约 10.2%,没有形成继续下跌信号。GPU、主板、HDD 与 SSD 只是同一公开渠道再次复核到相同最低价,不能外推为整个中国零售市场稳定。DRAM 固定 SKU 继续缺价,走势图保留真实空白尾段。SSD 页面头部的“¥819 起”是跨容量聚合口径,当前 2TB 规格全网比价仍为 ¥1,799,不能混用。本期购买建议只依据可复核价格序列,不引用未核实的新品或产能传闻。
其它你可能关心的
本期结论
两篇材料都在清理“为了少量元数据而持续支付的大成本”。Kotlin 把完整 protobuf 反序列化缩成一次首 tag 读取,使真实项目的 linker 热点从 7.5 秒降至 400 毫秒;rustc 则根据构建模式停写未被消费的辅助索引,在大型全量 check 样本中节省 62.6 MiB 最大 RSS。可迁移的方法是先画出数据的消费者集合,再选择最小读取或最小维护路径,并用接口断言、模式矩阵与多口径 benchmark 守住正确性边界。