本期检索说明
先读取 content/collections/deep-radar 截至 2026-10-07 的全部原文链接,并按 URL、标题与实现机制去重。最近 24 小时找到两项同时具备实测、源码证据与原理剖析的一手材料:Kotlin/Native 在显式 smallBinary=true 的 AArch64 构建中强制运行 LLVM Machine Outliner;rustc 升级 thin-vec,让 collect() 用迭代器 size_hint 预分配精确容量。Java/JVM、Zig 与 Linux 的新候选没有同时达到三条证据红线,本期不凑数。
两项改动截稿时都仍在开放评审。Kotlin 数据来自一个真实应用和一台 iPhone 13,但只有单次或小样本对照;Rust 的 30.69 MiB 来自 aws-sdk-ec2 全量 check,官方全局 rustc-perf 尚未完成。本文评价可追溯的公开 patch 与数字,不把“更小”写成“全面更快”,也不把一个大型 crate 的 RSS 降幅外推到所有项目。
| 主题 | 原始发布日期 | 一手来源与交叉验证 | 截稿状态 | 推荐强度 |
|---|---|---|---|---|
| Kotlin/Native AArch64 Machine Outliner | 2026-10-08 06:34(中原标准时间) | Kotlin PR #8802 / 编译器 patch / 符号计数 / KotlinConf 应用与真机指标 | 开放评审 | 强烈推荐,重点看体积、编译时间与运行时体验的三方权衡 |
rustc ThinVec::collect 容量控制 |
2026-10-08 08:26(中原标准时间) | Rust PR #163959 / thin-vec 上游 PR #99 / 容量测试 / 大型 crate RSS | 开放评审,rustc-perf 排队中 | 推荐,重点看小容器默认扩容如何积成编译器峰值内存 |
01 · Kotlin/Native:强制 Machine Outliner 能把文本段砍掉 44%,代价不会自动消失
原文与日期: Moya Veretennikova(moyaver),2026-10-08 06:34(中原标准时间);Kotlin PR #8802 与 完整源码 patch。
为什么值得读: smallBinary 的 IR pipeline 已使用 -Oz,但 Kotlin/Native 最终交给 clang codegen 的仍是 -O3;Kotlin 函数也没有 LLVM minsize 属性。AArch64 Machine Outliner 默认只积极处理带 minsize 的函数,因此“选择 small binary”并不意味着重复机器指令真的会被提取。这个 PR 把一个容易被优化级别名称掩盖的跨层断点找了出来,并用应用体积、真机 CPU、卡顿、启动和 codegen 时间同时约束结论。
核心技术结论: patch 只在四个条件同时成立时追加 -mllvm -enable-machine-outliner=always:开启优化、用户显式设置 smallBinary=true、目标架构为 ARM64、参数中没有已有的 outliner 开关。默认 watchOS 行为不变;用户传入 never 仍能退出;已有 cache object 不会被重新 outline,release 构建默认不使用 cache,因此语义边界清楚。
val outlineForSmallBinary = optimize && config.smallBinary &&
config.configuration.get(BinaryOptions.smallBinary) == true &&
config.target.architecture == Architecture.ARM64
if (outlineForSmallBinary &&
args.none { it.trimStart('-').startsWith("enable-machine-outliner") }
) {
args += listOf("-mllvm", "-enable-machine-outliner=always")
}Machine Outliner 在机器指令层寻找重复序列,把它们抽成 OUTLINED_FUNCTION_* 并把原位置改为调用。它节省的是重复代码字节,但额外分支、调用保存/恢复与 I-cache 行为可能拖慢热路径;这正是作者没有只贴一个包体数字的原因。
最有价值的实验、源码与 benchmark 细节: 在 macOS arm64、编译器 2.4.10+commit、仅含 fun main(){} 的样本中,smallBinary=true 时 OUTLINED_FUNCTION 符号从 9 个增至 800 个;false 和未显式设置都保持 9 个,显式 never 则为 0。新增的 SmallBinaryOutlinerTest 用 -Xtemporary-files-dir 保留 object 并数符号,直接验证参数确实改变后端产物,而不是依赖最终文件大小猜测。
更重要的是 KotlinConf 应用的端到端结果:iOS arm64 framework 的 __text 从 14.88 MB 降至 8.33 MB,缩小 44.0%;iPhone App Thinning 安装大小从 39.8 MB 降至 33.4 MB,缩小 16.1%。但 23 秒滚动测试 CPU 时间从 8.48 s 增至 8.94 s(+5.4%),single-frame hitch 从 18 增至 27(+50%),warm launch 从 451 ms 增至 465 ms(+3.1%),codegen 从 61 s 增至 93 s(+52.5%)。强制异常与 SIGSEGV 的报告仍保留逻辑调用栈,虽然顶层会出现 outlined helper。
这组数据支持的是“显式小体积模式值得用运行时成本换空间”,而不是“所有 ARM64 release 都应开启”。卡顿计数只有一次 23 秒轨迹,启动也没有误差区间;上线前仍应在自己的热路径、设备矩阵和 dSYM/崩溃平台上重复测量。
适合的工程师背景: 熟悉 Kotlin/Native、LLVM codegen、iOS 二进制尺寸或移动端启动与卡顿测量,正在为 watchOS/iOS 安装包做体积治理的工程师。
预计阅读收益: 约 35–50 分钟;能理解 IR 优化级别为何不等于机器级 outline、怎样为后端 flag 设计显式 opt-in/opt-out,以及如何把尺寸收益与 CPU、hitch、启动和编译时间放在同一张决策表里。
02 · rustc:一个忽略 size_hint 的小容器,能把数万个 1–3 元素集合都扩到 4
原文与日期: Josh Triplett(joshtriplett),2026-10-08 08:26(中原标准时间);Rust PR #163959、完整依赖升级 patch 与 thin-vec 上游修复 PR #99。
为什么值得读: rustc 大量使用只有 1–3 个元素的 ThinVec。旧 FromIterator 先构造空向量再 extend;第一次 reserve 会按最小增长策略把 capacity 提到 4,即使迭代器已经准确报告只会产生 1、2 或 3 项。单个容器只浪费几个 slot,但编译器里大量常驻小集合会把它放大成可测的峰值 RSS。这个案例展示了如何从通用容器的扩容策略一路追到真实大型 crate 的进程内存。
核心技术结论: 上游修复把 iterator 先物化为可查询对象,读取 size_hint().0,再用下界初始化容量;对于 Vec::into_iter()、数组和多数精确迭代器,下界就是最终长度。它不假设上界必然精确,后续 extend 仍能在低估时正常扩容。
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> ThinVec<T> {
let iter = iter.into_iter();
let mut vec = ThinVec::with_capacity(iter.size_hint().0);
vec.extend(iter);
vec
}对应回归测试遍历长度 0..20,同时断言 len() == i 与 capacity() == i。rustc 一侧没有额外算法改写,只把各 compiler crate 的 thin-vec 升至包含该修复的 0.2.21;这种“小 patch、宽使用面”的收益来源比在 rustc 内再包一层特例更可迁移。
最有价值的实验、源码与 benchmark 细节: aws-sdk-ec2 1.175.1 的 full check 最大 RSS 减少 30.69 MiB,相当于峰值的 0.55%;作者观察到指令数基本中性。这个比例不大,却说明浪费来自对象数量而非单对象尺寸:当绝大多数 ThinVec 落在 1–3 元素区间,每个 capacity 4 的 allocation 都会多保留未使用 slot。
证据限制必须和数字放在一起:截稿时 try build 已成功,但 rustc-perf 全局比较仍在排队,因此尚不能判断其他 workload 的 RSS 分布、wall-clock 噪声和可能的回退;30.69 MiB 也只来自一个极大的 crate。上游测试证明了容量语义,定向样本证明它能穿透到进程 RSS,但还不足以声称全局平均节省 0.55%。
适合的工程师背景: 熟悉 Rust allocator、集合扩容、rustc 内存剖析,或维护大量短小动态数组、small-vector 容器与编译器中间数据结构的工程师。
预计阅读收益: 约 25–35 分钟;能掌握 size_hint 的正确使用边界、默认增长策略如何放大小集合浪费,以及如何把容器级 capacity 测试与大型进程的 Max-RSS 证据串联起来。
中国大陆 ToC 硬件价格观察
数据口径
窗口为 2026-09-09 至 2026-10-08,单位人民币,六类硬件固定同一 SKU。今天通过公开比价页的实时渲染结果复核到 CPU、GPU、主板、HDD、SSD 五类报价,五类均与昨日相同;DRAM 页面仍明确显示“暂无报价”,因此不新增点。重复价格作为真实采样保留,用来区分“已复核横盘”和“未取得数据”。SSD 只采用当前 2TB 规格的全网比价栏,不采用跨容量聚合的“¥819 起”。
| 类别 | 10 月 8 日可复核价 | 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–8 ¥2,699 | 观望;处于窗口高位,较 9/9 低点高约 10.2% |
| GPU | MSI RTX 5070 VENTUS 3X 12G,亚马逊中国 ¥4,464.34 | 9/9–10/8 多次实时复核均为 ¥4,464.34 | 刚需可比价后入手;单一渠道横盘不等于全市场没有促销 |
| 主板 | ASUS TUF B850M-PLUS WIFI7,天猫 ¥1,299 | 9/9–10/8 多次复核均为 ¥1,299 | 刚需可入;公开最低价稳定,但下单前核对店铺与售后 |
| DRAM | 暂无报价;最后可复核 9/9 ¥3,900 | 9/9 ¥3,900,此后缺价 | 观望;固定 SKU 缺价,不用其他容量、颗粒或时序替代 |
| HDD | IronWolf Pro 8TB ST8000NE001,i百联 ¥1,849 | 9/9–10/8 多次复核均为 ¥1,849 | 容量刚需可买;先核对型号、五年保修与数据恢复服务 |
| SSD | ZHITAI Ti600 2TB,京东 ¥1,799 | 9/23–10/8 多次复核均为 ¥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/Native 的 Machine Outliner 用 44.0% 的 framework 文本段缩减换来 52.5% 的 codegen 增长及可见的运行时回退;rustc 的 ThinVec 修复则通过尊重已有 size_hint,在不增加算法复杂度的情况下消除 1–3 元素集合的 capacity 4 浪费。工程上最值得迁移的是同时测“产物、构建与运行”,并把尚未完成的全局 benchmark 明确留作证据缺口。