典型 PC 系统各种操作指令的大概时间
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 通过 1G bps 的网络发送 2K 字节 | 20,000 nanosec |
read 1MB sequentially from memory 从内存中顺序读取 1MB 数据 | 250,000 nanosec |
fetch from new disk location (seek) 从新的磁盘位置获取数据(随机读取) | 8,000,000 nanosec |
read 1MB sequentially from disk 从磁盘中顺序读取 1MB 数据 | 20,000,000 nanosec |
send packet US to Europe and back 从美国发送一个报文包到欧洲再返回 | 150 milliseconds = 150,000,000 nanosec |
一般来说。CPU需要0个周期来访问其寄存器,1-30个周期来访问高速缓存,50-200个周期来访问主存。
对于Intel Core i7来说。这个值可以很具体。Intel Core i7的主频约在2-3GHz。可以计算出。
L1—指令缓存 | L1-数据缓存 | L2-缓存 | L3-缓存 | 内存 | |
访问周期 | 4 | 4 | 11 | 30-40 | 50-200 |
缓存大小 | 32KB | 32KB | 256KB | 8MB | 若干GB |
访问时间 | 2ns | 2ns | 5ns | 14-18ns | 24-93ns |
也就是说,访问内存的时间是ns级别的。
再来看看磁盘。
磁盘的访问时间=寻道时间+旋转延迟+数据传输时间。对于普通的7200转STAT磁盘。这个值是:9ms+4ms+0.02ms=13.02ms。
也就是说,如果从磁盘随机访问一个字节,需要13.02ms,比从内存获取的时间24-93ns,至少要多14万倍。相差5个数据级,何其巨大的差距。
顺序读写磁盘会快一些。 假设一个盘片有1000个扇区,每个扇区512字节,7200转。顺序读可以忽略掉寻道的时间。所以吞吐量是 扇区数×扇区大小×转速=1000*512/(60/7200)=58MB/s。这个数据似乎不咋样。如果使用多盘系统。STAT II的接口,吞吐量可以达到300MB/s。追求极限性能可以mount裸盘直接操作多盘。
总结。
这些数据都不一定是所用机器的真实数据,但根据比例关系,可以了解到各个流程中的大概耗时。对于写的程序,也有一些参考依据。
不过若是实际项目,还是需要了解所用机器的真实性能。