先说结论:良好的局部性会让应用程序执行的更快,本质是提高对缓存数据的命中率.
局部性原理
计算机中的局部性设计来源于缓存的概念,由于存储器的速度不一样,寄存器>高速缓存存储器>主存>磁盘,为了提高系统的运行速度,会将近期使用的数据存储在高速存储器(空间小,昂贵)中,这个就是缓存的概念,由缓存产生了系统局部性原理的设计.
硬件,操作系统都用到了局部性原理,由于高速缓冲存储器(高速缓存)小而快速的存在,操作系统需要极大限度的利用缓存,操作系统会将近期访问过的数据以及其附近数据存储在高速缓存中,从而提升cpu对主存的访问速度.(主存对磁盘的缓存原理一致)
应用程序的局部性
应用程序的局部性设计来源于硬件和操作系统的局部性设计.为了更好的利用硬件和操作系统的缓存数据,提升程序运行速度,良好的程序也应该具备良好的局部性.
局部性形式
一般有两种形式:时间局部性和空间局部性.
1.时间局部性,如果缓存的某个数据会被多次引用,提升了对缓存数据的利用,程序可以视为具有良好的时间局部性.
2.空间局部性,硬件和操作系统会缓存引用数据的周围数据,例如数组,如果你访问了数组的第一条数据,该条数据后面的部分数据也会跟着缓存在高速存储器中.如果后续能使用该数据的周边数据,程序可以视为具有良好的空间局部性.
应用程序局部性设计
首先我们明确一点,对缓存数据的利用率高,局部性设计就好.由于高速缓存的缓存数据为近期引用过的数据和其附近数据,只要利用好这个点,提高数据缓存命中率,就可以提升程序的局部性.
对于局部性设计有以下几个简单原则:
1.重复引用相同变量的程序有较好的时间局部性.
2.引用近期访问数据的周围数据(数组,结构体),访问跨度不能太大,例如:a[1000]数组,a[0],a[1],a[2],a[3]等顺序访问该数组比a[10],a[1],a[15]等乱序访问该数组速度快,空间局部性更好.
3.程序指令的局部性,程序指令放在内存中,CPU取程序指令也有局部性设计的评价.对取指令来说,循环有良好的时间和空间局部性.但是太大的循环局部性会比较差,因为高速缓存存储空间有限,很难存储太大的循环.循环体越小,循环迭代次数越多,局部性越好.
参考书籍
深入理解计算机系统第三版