数据转载自:Latency Numbers Every Programmer Should Know (2025 Update),其提供了柱状图,建议访问感受下各项操作的延时差距。
1. 核心延迟数据表#
| 操作项目 (Operation) | 延迟时间 (Latency) | 原文 |
|---|
| L1 缓存读取 | 1 ns | L1 Cache Reference |
| 分支预测错误 | 5 ns | Branch Mispredict |
| L2 缓存读取 | 7 ns | L2 Cache Reference |
| 互斥锁 加锁/解锁 | 25 ns | Mutex Lock/Unlock |
| 主存(RAM)读取 | 100 ns | Main Memory Reference |
| 系统调用 | 500 ns | System Call |
| 在 10Gbps 网络中发送 2KB 数据 | 1.6 μs | Send 2KB over 10Gbps Network |
| 使用 Zippy 算法压缩 1KB 数据 | 3 μs | Compress 1KB with Zippy |
| 上下文切换 | 10 μs | Context Switch |
| SSD 随机读取 (4-8KB) | 100 μs | SSD Random Read (4-8KB) |
| 从内存连续读取 1MB | 250 μs | Read 1MB from Memory |
| 数据中心内部往返 (RTT) | 500 μs | Datacenter Round Trip |
| 从 SSD 连续读取 1MB | 1 ms | Read 1MB from SSD |
| 机械硬盘 (HDD) 寻道 | 10 ms | HDD Disk Seek |
| 从机械硬盘连续读取 1MB | 20 ms | Read 1MB from HDD |
| 广域网往返 (加州到欧洲) | 150 ms | WAN Round Trip (CA-EU) |
额外补充#
| 操作项目 (Operation) | 延迟时间 (Latency) |
|---|
| 广域网往返 (广州到上海) | ~ 30 ms |
| 广域网往返 (广州到北京) | ~ 45 ms |
2. 数据理解#
- CPU对比内存存在100倍差距,所以选择合适的数据结构很重要,比如数组访问内存的次数比链表少,也就更快。
- 内存对比SSD存在1000倍差距,所以在磁盘操作中,尽量批量和顺序化。SSD读1MB需要1ms,随机读 4KB需要100μs,换算后1MB的数据随机读比顺序读慢25倍,所以在数据库,会利用追加写、合并写、批量 flush来做优化。
- 本地IO对比跨洲网络存在1000倍差距,远程调用是昂贵的,不要在循环里面发起调用,提供批量接口节省大量网络访问时间。
- 数据中心内部一次往返需要500μs,对比本地SSD随机读取在同体格数量级,相对机械硬盘一次寻道更快,所以会有分布式内存缓存系统,以及基于网络的块存储系统。
- 压缩可能比网络更快,压缩 1KB需要3μs,相对于一次RTT的500μs是非常划算,所以网关或者消息中间件一般都会选择开启压缩。
Reference#
- Numbers Every Programmer Should Know By Year