看书的时候,遇到这么一个表,我觉得非常有用,特此记录下。

下表展示了一个 3.3GHz 的 CPU,访问各存储设备的耗时,以及等比放大后的相对时间。

事件 延时 相对时间比例
1个 CPU 周期 0.3 ns 1 s
L1 缓存访问 0.9 ns 3 s
L2 缓存访问 2.8 ns 9 s
L3 缓存访问 12.9 ns 43 s
主存访问 120 ns 6 分
固态硬盘(SSD) 50-150 us 2-6 天
旋转磁盘 1-10 ms 1-12 月
网络:从北京上海 30 ms 3 年
网络:从北京到旧金山 190 ms 19 年
TCP 重传 1-3 s 105-317 年

从上面这张表,我们可以得到什么启示?我认为至少有以下几点:

  • 各存储器的访问时延,比我们想象中的要大,看似纳秒和微秒都很快,但实际上相差巨大,一次磁盘 IO 的时延,CPU 可以执行十万百万条指令。
  • 各存储器访问的数量级,比如 SSD 访问在微秒(us)级别,而普通磁盘访问在毫秒(ms)级别
  • 数据越“靠近” CPU,访问更快,但存储设备也越贵,存储容量也越小。如旋转磁盘现在 TB 级别很常见,而主存还基本是 GB 级别,L1~L3 缓存只有 KB 级别。这是一个速度和成本的博弈,如果想追求速度,钱不是问题,那么请用更好的 CPU,更大的内存,而不是更大的磁盘;反之,如果钱很紧张,数据访问的频次低,那么可以降低内存,而换上更大的硬盘。
  • 所有的性能问题,都可以从四个方面优化:CPU,内存,IO,网络。且收益依次增高,如减少一次网络调用带来的收益,要比减少一次磁盘访问带来的收益更大更明显

上面这个表,也印证了一句经典的话:计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。L1~L3 缓存是 CPU 和内存之间的中间层,而内存又是磁盘和 CPU 缓存之间的中间层