代码优化之局部性设计(提高对缓存的命中率)

先说结论:良好的局部性会让应用程序执行的更快,本质是提高对缓存数据的命中率.

局部性原理

计算机中的局部性设计来源于缓存的概念,由于存储器的速度不一样,寄存器>高速缓存存储器>主存>磁盘,为了提高系统的运行速度,会将近期使用的数据存储在高速存储器(空间小,昂贵)中,这个就是缓存的概念,由缓存产生了系统局部性原理的设计.

硬件,操作系统都用到了局部性原理,由于高速缓冲存储器(高速缓存)小而快速的存在,操作系统需要极大限度的利用缓存,操作系统会将近期访问过的数据以及其附近数据存储在高速缓存中,从而提升cpu对主存的访问速度.(主存对磁盘的缓存原理一致)

应用程序的局部性

应用程序的局部性设计来源于硬件和操作系统的局部性设计.为了更好的利用硬件和操作系统的缓存数据,提升程序运行速度,良好的程序也应该具备良好的局部性.

局部性形式

一般有两种形式:时间局部性和空间局部性.

1.时间局部性,如果缓存的某个数据会被多次引用,提升了对缓存数据的利用,程序可以视为具有良好的时间局部性.

2.空间局部性,硬件和操作系统会缓存引用数据的周围数据,例如数组,如果你访问了数组的第一条数据,该条数据后面的部分数据也会跟着缓存在高速存储器中.如果后续能使用该数据的周边数据,程序可以视为具有良好的空间局部性.

应用程序局部性设计

首先我们明确一点,对缓存数据的利用率高,局部性设计就好.由于高速缓存的缓存数据为近期引用过的数据和其附近数据,只要利用好这个点,提高数据缓存命中率,就可以提升程序的局部性.

对于局部性设计有以下几个简单原则:

1.重复引用相同变量的程序有较好的时间局部性.

2.引用近期访问数据的周围数据(数组,结构体),访问跨度不能太大,例如:a[1000]数组,a[0],a[1],a[2],a[3]等顺序访问该数组比a[10],a[1],a[15]等乱序访问该数组速度快,空间局部性更好.

3.程序指令的局部性,程序指令放在内存中,CPU取程序指令也有局部性设计的评价.对取指令来说,循环有良好的时间和空间局部性.但是太大的循环局部性会比较差,因为高速缓存存储空间有限,很难存储太大的循环.循环体越小,循环迭代次数越多,局部性越好.

参考书籍

深入理解计算机系统第三版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值