Go 高效编程(五)
原文:
zh.annas-archive.org/md5/55d311da1d04b7a03267ba5252fa91c8译者:飞龙
附录 A. Napkin Math 计算的延迟
为了设计和评估不同层面的优化,了解我们与计算机交互中看到的基本操作的延迟数字是很有用的。
记住其中一些数字是很好的,但如果你不记得,我已经在表 A-1 中准备了一个简单的表格,显示了近似、四舍五入的平均延迟,这个表格深受Simon Eskildsen 的 napkin-math 代码库启发,做了一些修改。
该代码库创建于 2021 年。对于基于 CPU 的操作,这些数字基于来自至强家族的服务器 x86 CPU。请注意,尽管每年都在改善,但由于“硬件变得更快更便宜”中解释的限制,大部分数字自 2005 年以来保持稳定。CPU 相关的延迟也可能因不同的 CPU 架构(如 ARM)而有所不同。
表 A-1. CPU 相关的延迟
| 操作 | 延迟 | 吞吐量 |
|---|---|---|
| 3 GHz CPU 时钟周期 | 0.3 ns | N/A |
| CPU 寄存器访问 | 0.3 ns(1 个周期) | N/A |
| CPU L1 缓存访问 | 0.9 ns(3 个周期) | N/A |
| CPU L2 缓存访问 | 3 ns | N/A |
| 顺序内存读写(64 字节) | 5 ns | 10 GBps |
| CPU L3 缓存访问 | 20 ns | N/A |
| 哈希运算,不是加密安全(64 字节) | 25 ns | 2 GBps |
| 随机内存读写(64 字节) | 50 ns | 1 GBps |
| 互斥锁的加锁/解锁 | 17 ns | N/A |
| 系统调用 | 500 ns | N/A |
| 哈希运算,加密安全(64 字节) | 500 ns | 200 MBps |
| 顺序 SSD 读取(8 KB) | 1 μs | 4 GBps |
| 上下文切换 | 10 μs | N/A |
| 顺序 SSD 写入,-fsync(8KB) | 10 μs | 1 GBps |
| TCP 回显服务器(32 KiB) | 10 μs | 4 GBps |
| 顺序 SSD 写入,+fsync(8KB) | 1 ms | 10 MBps |
| 排序(64 位整数) | N/A | 200 MBps |
| 随机 SSD 寻址(8 KiB) | 100 μs | 70 MBps |
| 压缩 | N/A | 100 MBps |
| 解压缩 | N/A | 200 MBps |
| 代理:Envoy/ProxySQL/NGINX/HAProxy | 50 μs | ? |
| 同一区域内的网络 | 250 μs | 100 MBps |
| MySQL,memcached,Redis 查询 | 500 μs | ? |
| 随机 HDD 寻址(8 KB) | 10 ms | 0.7 MBps |
| 美国东部↔西部的网络 | 60 ms | 25 MBps |
| 欧洲西部↔美国东部的网络 | 80 ms | 25 MBps |
| 美国西部↔新加坡的网络 | 180 ms | 25 MBps |
| 欧洲西部↔新加坡的网络 | 160 ms | 25 MBps |