【Rust日报】2026-10-04 ArcColdString:引用计数字符串压到 8 字节

💡 原文中文,约2600字,阅读约需7分钟。
📝

内容提要

本期 Rust 资讯:cold-string 将不可变字符串压缩至 8 字节,引用计数版 ArcColdString 堆开销更低;ying-profiler 是面向生产环境的采样内存分析器,支持 retained memory 与异步栈;pqc-kem 实测混合后量子 KEM,加入 X25519 封装后慢近 3 倍但仍默认开启;Kobzol 发布八九月上游维护报告,重点缩小 target 目录并推进编译性能工作。

🔎

延伸解读

字符串压缩的取舍:内联与堆开销

cold-string 将不可变字符串压到 8 字节,短串直接内联,长串用变长长度头,堆额外开销约 1–9 字节。相比 Arc<str> 的 16 字节指针+长度对,这种设计在大量小字符串场景下能显著降低内存占用。但内联串的 clone 是直接拷贝,不走引用计数,若频繁克隆长内联串可能带来拷贝成本。

引用计数版的内存优势与窄计数

ArcColdString 句柄仍为 8 字节,堆上增加 AtomicUsize 引用计数,并提供 32/16/8 位窄计数版本以缩小堆头。作者给出的理论开销显示,128 字节串下 ArcColdString 仅 17 字节,远低于 Arc<str> 的 32 字节。预分配 Vec 中每条唯一 8 字节串的 RSS 约 8.0 字节,而 Arc<str> 约 47.1 字节,适合内存敏感型应用。

后量子混合 KEM 的性能代价与默认策略

pqc-kem 实测显示,ML-KEM-768 加入 X25519 封装后,keygen、encapsulate、decapsulate 分别慢约 1.88x、2.85x、1.79x,发送端多约 100 µs,接收端多约 50 µs。尽管有性能开销,产品仍默认开启 hybrid,因为密钥交换需对冲“先录后解”风险;而签名侧 Ed25519 hybrid 默认关闭,因坏签名方案可轮换重签。

上游维护:缩小 target 目录的进展

Kobzol 的八九月报告重点之一是缩小 target 目录。nightly 默认启用 -Zembed-metadata=no,元数据只留在 .rmeta 并通过 --extern 传给 rustc。编译器侧 -Zembed-metadata 正推进稳定为 -Cembed-metadata,已进入 FCP;Cargo 侧也有对应稳定报告。计划双旗并存一段时间,避免 nightly 断裂。

❓

Q&A

ArcColdString 如何将引用计数字符串压缩到 8 字节?

ArcColdString 使用 8 字节句柄,短字符串(最多 8 字节)直接内联存储,不经过引用计数;长字符串在堆上使用变长长度头,额外开销约 1–9 字节,并添加 AtomicUsize 引用计数。因此句柄保持 8 字节,且 Option<ColdString> 无额外内存开销。

ArcColdString 与 Arc<str>、arcstr 在内存开销上相比如何?

根据作者给出的 64 位理论开销(不含 UTF-8 载荷):8 字节串时,Arc<str> 为 32 字节,arcstr::ArcStr 为 24 字节,ArcColdString 为 0(内联);128 字节串时分别为 32、24、17 字节。预分配 Vec 中每条唯一 8 字节串的 RSS:Arc<str> 约 47.1 字节,ArcColdString 约 8.0 字节。

ying-profiler 是什么?它主要解决什么问题?

ying-profiler 是一个原生 Rust 采样内存分析器,跟踪 retained memory 和分配次数,面向异步 Rust 生产环境。它旨在提供更低资源占用、更易读的产物,并更好地支持 async/Tokio + tracing 的栈以及 retained memory 分析。

pqc-kem 中混合后量子 KEM 的性能开销有多大?

在 Xeon Platinum 8488C 上,ML-KEM-768 单独 keygen/encapsulate/decapsulate 约 51.7/54.6/64.0 µs;加入 X25519 hybrid 后约 97.2/155.8/114.4 µs,对应约 1.88x/2.85x/1.79x。相对单次握手,发送端大约多 100 µs,接收端大约多 50 µs。

为什么 pqc-kem 默认开启混合密钥交换,而签名侧默认关闭?

产品默认打开 hybrid 密钥交换,因为今天录下来的会话以后无法补救,需要提前对冲量子威胁;而签名侧的 Ed25519 hybrid 在 pqc-sig 里默认关闭,理由是坏掉的签名方案可以轮换重签。

Kobzol 在 2026 年 8-9 月的 Rust 上游维护报告中提到了哪些主要工作?

报告重点包括:缩小 target 目录,nightly 默认启用 -Zembed-metadata=no,并推进 -Cembed-metadata 稳定;编译时间实验(arena 分配等收获有限);Polonius、并行前端推进、ARM 上的编译器性能测量、增量编译、合并队列、Josh subtree 迁移,以及跟踪 rust-lang crates、thanks.rust-lang.org、rustup-components-history 等维护项。

🏷️

标签

➡️

继续阅读