接受Peter Norvig 的建议,我正在思考这个问题:
从内存中取出一个单词需要多长时间,无论有没有缓存未命中?
(假设标准硬件和架构。为了简化计算假设 1Ghz 时钟)
似乎 Norvig自己回答了这个问题:
execute typical instruction 1/1,000,000,000 sec = 1 nanosec
fetch from L1 cache memory 0.5 nanosec
branch misprediction 5 nanosec
fetch from L2 cache memory 7 nanosec
Mutex lock/unlock 25 nanosec
fetch from main memory 100 nanosec
send 2K bytes over 1Gbps network 20,000 nanosec
read 1MB sequentially from memory 250,000 nanosec
fetch from new disk location (seek) 8,000,000 nanosec
read 1MB sequentially from disk 20,000,000 nanosec
send packet US to Europe and back 150 milliseconds = 150,000,000 nanosec
它说“执行典型指令”= 1 ns 的部分意味着 1 GHz CPU(当然假设有效流水线)。
我不知道他从哪里获取这些信息,但我相信 Peter Norvig 是可靠的 :-)
公平的总结在这里,有些不精确。在编写(2 年多前)和当时的中档 PC 时,它估计:内存访问,60ns;一级缓存,10ns;L2 缓存,20-30ns(没有估计 L3 缓存访问时间)。当然,这一切都有很大的不同,具体取决于争用和访问模式(因为缓存层通常从较慢的内存中“按行”填充,如果您访问地址 X,那么地址 X+1,第二次访问可能会更快一点,因为缓存行填充由第一次访问开始)。
而且,当然,经过良好调整的高端服务器会快得多(此类机器在内存访问延迟方面的相对差异通常远大于“原始”CPU 速度)。
在 github.org 上发布的该表中的数据有一个很好的可视化,他们还对那里的时间值进行了“人类规模”的重新解释。