Google大神 Jeff Dean在之前的一次演讲中展示了这样一张表:
从这张图里我们可以看到,计算机系统中各种关键操作其典型耗时到底有多少(注意,各种不同的系统架构精确的数据可能与此不同,但数量级上差别应该不会很大)。
访问内存和cache
访问L2 cache的时延大概是访问L1 cache的10几倍左右,而访问一次内存的时延则高达访问L2 cache的20倍,是访问L1cache耗时的200倍。所以,编写出对cache友好的程序是至关重要的,尤其场景如果对性能要求很高则更是如此。
分支预测
分支预测主要针对 if 语句,由于现代CPU内部采用流水线方式来处理机器指令,因此在 if 对应的机器指令还没有执行完时,后续指令就要进到流水线中,此时CPU就必须猜测到底 if 语句是否为真,如果CPU猜对了,那么流水线照常运行,但如果猜错了流水线中已经被执行的一部分指令就要作废。
分支预测失败的惩罚不高,大概只有5ns这个量级,并且现代CPU的分支预测成功率很高,根本不必在意这点性能损失。
访问内存、SSD和磁盘
同样顺序读取1MB数据,内存花费的时间为250,000 ns,SSD为1,000,000 ns,磁盘为20,000,000 ns。磁盘花费的时间是 SSD 的 20 倍,是内存的80倍。
网络IO和磁盘IO
一般来说,网络IO要比磁盘IO要慢的多,但通过上表可以看到,使用IGbps网络发送1KB数据仅需要20,000ns,而磁盘的一次寻道则高达10,000,000ns(10ms),所以,网络IO可不一定比磁盘IO慢。
但是,这要看网络两端距离有多远(通过ping命令来测试网络IO的延时)。上表的网络IO是数据中心的场景,距离基本忽略不计。并且,网络IO从远程机器读取数据,如果这个数据不在内存,则要访问SSD或者磁盘,还是会很慢。
结语
题外话
小明实习加油!!!!!