每个程序员都应该知道的延迟时间表
目录
翻译自:Latency Numbers Every Programmer Should Know
操作 | 延迟(纳秒) | 延迟(微秒) | 延迟(毫秒) | 参考 |
---|---|---|---|---|
CPU L1 级缓存访问 | 0.5 ns | |||
分支预测错误* | 5 ns | |||
CPU L2 级缓存访问 | 7 ns | 14x L1 cache | ||
互斥体Mutex 加锁/解锁 | 25 ns | |||
内存访问 | 100 ns | 20x L2 cache, 200x L1 cache | ||
用Zippy压缩1K字节 | 3,000 ns | 3 us | ||
在1 Gbps速率的网络上发送1K字节 over | 10,000 ns | 10 us | ||
从SSD读取4K长度的随机数据 | 150,000 ns | 150 us | ~1GB/sec SSD | |
从内存读取连续的1 MB长度数据 | 250,000 ns | 250 us | ||
在同一数据中心内的来回通讯延迟* | 500,000 ns | 500 us | ||
从SSD读取连续的1 MB长度数据 | 1,000,000 ns | 1,000 us | 1 ms | ~1GB/sec SSD, 4X memory |
磁盘寻址 | 10,000,000 ns | 10,000 us | 10 ms | 20x datacenter roundtrip |
从磁盘读取连续的1 MB长度数据 | 20,000,000 ns | 20,000 us | 20 ms | 80x memory, 20X SSD |
发送数据包 California->Netherlands->California | 150,000,000 ns | 150,000 us | 150 ms |
分支预测错误(Branch misprediction): 在包含了分支指令(if-then-else)的程序的执行过程中,其执行流程根据判定条件的真/假的不同,有可能会产生跳转,而这会打断流水线中指令的处理,因为CPU无法确定该指令的下一条指令,直到分支指令执行完毕。流水线越长,CPU等待的时间便越长,因为它必须等待分支指令处理完毕,才能确定下一条进入流水线的指令。为了解决这一问题,分支预测器(Branch predictor)在分支指令执行结束之前猜测哪一路分支将会被运行,以提高处理器的指令流水线的性能在分支执行完毕前先进行分支预测,分支预测器有很多种实现。其中最简单的是静态分支预测,方法是任选一条分支进入流水线,但是有50%的概率会预测错误,这时候就会出现分支预测错误
来回通讯延迟(Round-trip delay time),在通讯(Communication)、电脑网络(Computer network)领域中,意指:在双方通讯中,发讯方的讯号(Signal)传播(Propagation)到收讯方的时间(意即:传播延迟(Propagation delay)),加上收讯方回传讯息到发讯方的时间(如果没有造成双向传播速率差异的因素,此时间与发讯方将讯号传播到收讯方的时间一样久)
最后附上一张形象的图片
Credit: https://imgur.com/k0t1e
参考:
- Latency Numbers Every Programmer Should Know
- CPU缓存
- 分支预测器
- Branch misprediction
- 来回通讯延迟