每个程序员都应该知道的延迟时间表

  • Jinhai ZHOU
  • 3 Minutes
  • 2017年10月30日

目录

翻译自: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)),加上收讯方回传讯息到发讯方的时间(如果没有造成双向传播速率差异的因素,此时间与发讯方将讯号传播到收讯方的时间一样久)

最后附上一张形象的图片
Latency Numbers Every Programmer Should Know
Credit: https://imgur.com/k0t1e

参考:

  1. Latency Numbers Every Programmer Should Know
  2. CPU缓存
  3. 分支预测器
  4. Branch misprediction
  5. 来回通讯延迟
知识共享许可协议
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。