正常
CppCon2025
Cache-Friendly C++
Jonathan Müller
这是 CppCon 2025 上 Jonathan Müller 的演讲笔记。Jonathan 长期做低延迟 C++(演讲时在 think-Cell,后来去了 LSEG 做 HFT 的行情数据通路),这场他从一个让很多人血压拉满的反直觉现象讲起:std::unordered_set 的查找是 O(1),std::vector 的线性查找是 O(n),可在真实机器上一跑,小数据量下 vector 居然把 unordered_set 摩擦了。答案只有一个方向:CPU 缓存。
这场演讲跟 微基准测试那场是姊妹篇。那场的第三篇已经点到分支预测器和缓存联手作弊,但没展开缓存本身。这一场就是把缓存这件事从根上讲透:它为什么存在、按什么单位搬运数据、各级延迟差多少、以及你在 C++ 里选容器、选数据类型、排结构体布局时,每一个决定是怎么落到缓存行为上的。
笔记拆成四篇,沿着"先打破复杂度迷信,再建缓存直觉,最后落到代码"的顺序走。所有实验都在同一台机器上跑:Arch Linux / WSL2,AMD Ryzen 7 9700X(Zen 5),GCC 16.1.1,-std=c++20,缓存层级是 L1d 每核 48KiB / L2 每核 1MiB / L3 32MiB 共享。你手上的数字会不一样,但结论的方向是一样的。