根据时间局部性和空间局部性原理,我们就能明白高速缓存存储器的工作原理,局部性比较好的程序往往具有更好的性能,即运行得更快。因此,遵从局部性原理,好的程序员应该确保编写出高速缓存友好的代码。
#include<stdio.h> void main() { int a[4]={1,2,3,4}; int i; int sum=0; for(i=0;i<4;i++) sum+=a[i]; }
该程序具有良好的时间局部性,因为i,sum均被重复使用多次;该程序也具有良好的空间局部性,因为依次读取数组a的4个元素,由于int类型占据4个字节,因此只要高速缓存块大小大于16个字节(intel i7的块大小为64Bytes,因此足够),它们就可以一起被读入高速缓存块中,而仅仅是a[0]发生了高速缓存不命中,因为它第一个被读取需要加载,而后面3个量均为高速缓存命中。
#include<stdio.h> void main() { int a[2][2]={{1,2},{3,4}}; int i,j,sum=0; for(int j=0;j<2;j++) { for(int i=0;i<2;i++) { sum+=a[i][j]; } } }
由于C语言是按行优先顺序来存储的,所以这个循环的步长不是以1为单位的,并且每次读取都要换行,所以所有的读取都发生了缓存不命中情况,程序运行效率会比高速缓存友好的程序慢一倍!
在平时的编程中,应该尽量避免编写局部性很差的程序,尝试编写高速缓存友好高质量的代码。
原文:http://my.oschina.net/zzw922cn/blog/416387