Latency Numbers Every Programmer Should Know [每个程序员都该知道的数字]
这份列表由 Jeff Dean 提出,用于帮助程序员建立对计算机系统中各类操作相对开销的直觉。以下是经典版本(约2012年,后有若干修订)
| Scenario | Latency |
|---|---|
| L1 cache reference [1] | 0.5 ns |
| Branch mispredict [2] | 5 ns |
| L2 cache reference | 7 ns |
| Mutex lock/unlock | 25 ns |
| Main memory reference | 100 ns |
| Compress 1K bytes with Zippy | 3,000 ns (3 µs) |
| Send 2K bytes over 1 Gbps network | 20,000 ns (20 µs) |
| SSD random read | 150,000 ns (150 µs) |
| Read 1 MB sequentially from memory | 250,000 ns (250 µs) |
| Round trip within same datacenter | 500,000 ns (0.5 ms) |
| Read 1 MB sequentially from SSD [3] | 1,000,000 ns (1 ms) |
| Disk seek | 10,000,000 ns (10 ms) |
| Read 1 MB sequentially from disk | 20,000,000 ns (20 ms) |
| Send packet CA->Netherlands->CA | 150,000,000 ns (150 ms) |
三个核心结论:(1) 缓存层级的影响极大,L1 比主内存快约 200 倍;(2) 网络和磁盘是真正的瓶颈,一次磁盘寻道约比L1访问慢十万倍;(3) 局部性至关重要,顺序读取远优于随机访问,在机械硬盘上尤其明显。
对于这个列表,不要死记具体数字,而要记住结构与比例。真正有用的是数量级直觉,而且精确数值本身会随硬件发展而变化。
可以通过按10的幂次把操作归入几个档位:
-
约1 ns是缓存与分支操作;
-
约 100 ns 是主内存;
-
约 1–10 µs 是小数据网络发送和压缩;
-
约 100 µs–1 ms 是 SSD 读取和数据中心往返;
-
约 10 ms 是磁盘寻道;
-
约 100 ms 是跨洲往返。
只要能判断某个操作落在哪一档,就已经掌握了这份列表 90% 的实用价值。
这份列表在2025-2026年还成立吗?
仍然成立的部分:整体结构,层级关系和相对顺序依然完全正确:缓存快于内存,内存快于存储,本地快于远程,顺序优于随机。L1约 1 ns、主内存约 100 ns 这两个数字依旧准确,因为 DRAM 的延迟在十多年里几乎没有改善(改善的是带宽)。跨洲往返的 150 ms 同样纹丝不动,因为它受光速限制,这是物理定律,无法优化。
明显过时的部分,变化最大的是 SSD:原列表基于 SATA SSD,假设随机读约 150 µs;而现代 NVMe 盘的随机读普遍在 10–20 µs 量级,高端型号更低。因此”SSD 比内存慢约一千倍”的旧直觉,如今更接近一百倍甚至更好。机械硬盘的 10 ms 寻道时间本身仍然准确,但在大多数性能敏感场景中已退居冷存储,这个数字变得不那么相关了。数据中心内部网络也有改善且差异极大,采用 RDMA 或高端网络架构可以做到远低于 10 µs,原来的 500 µs 已属保守。压缩数字则因 CPU 提速和 Zstd、LZ4 等新算法而变化,不过它本来更多是示意性质。
更深层的转变, 原列表以 CPU 和存储为中心。而在2025-2026年,大量性能关键工作涉及列表完全没有覆盖的内容:GPU 与加速器的内存层级(HBM 带宽、NVLink 等跨卡互连)、数据在加速器之间搬进搬出的高昂代价、以及 PCIe 传输开销。对于机器学习和数据密集型负载,这些才是工程师真正在推理的延迟数字,而 Jeff Dean 的原始列表诞生于这一切之前。
个人认为这份列表对于培养计算机工程直觉依然优秀甚至是持久的;但不应把其中的 SSD 和数据中心网络的原始数值用于 2025 年的实际工程决策——这些项已经改善了大约一个数量级。而受物理规律锁定的那些数字(缓存、内存延迟、跨洲往返)则一如既往地准确。