通过优化存储局部性提升程序性能

原文链接

计算机的存储系统是一个具有不同容量成本和访问时间的存储设备的层级结构。层次结构图如下图所示:

层次结构上从上至下,访问速度逐渐降低,容量逐渐增大,单位存储的成本逐渐降低。从上至下依次是寄存器、L1 L2 L3高速缓存、主存、本地存储、远端存储。寄存器被集成在CPU里面访问速度最快,容量最小。L1 L2 L3是CPU的高速缓存,访问速度和容量L1 > L2 > L3 ,其实L1 L2 L3 高速缓存,也是一套缓存系统,L2 是L1的缓存,L3是L2的缓存,引入缓存系统也是为了降低日益增长的CPU计算速度与缓存发展的内存访问速度之间的鸿沟。

随机访问存储器(RAM)分为两类,静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM),SRAM的访问速度和单位存储的价格要比DRAM高。L1 L2 L3高速缓存就是SRAM。而我们常说的4G 8G 16G的存储指的就是DRAM.

随机访问存储器失电之后无法保持原有的状态,也就无法持久化存储,持久化存储还是需要非易失性存储器,包括磁盘存储(EPROM)。固态硬盘(SSD),访问速度和单位成本固态硬盘都超过了磁盘存储。

CPU在计算的时候会访问数据,先访问寄存器如果不存在,会从L1 L2 L3缓存中取,如果还不存在会从主存DRAM读取对应的数据,如果同样不存在会从磁盘中加载对应的数据。每次缓存的击穿访问都会降低程序的性能,不同层级的存储访问速度差距在几十倍到几万倍不等。所以要提高程序的性能必须提高程序的局部性。

一个良好的程序常常有良好的局部性,也就是倾向于引用临近于其它最近引用过的数据项的数据项,或者最近引用过的数据项本身,这种倾向性,被称为局部性原理。局部性通常有两种不同的形式:时间局部性和空间局部性。在一个具有良好时间局部性的程序中被引用过一次的内存位置很可能在不远的将来再被多次引用。在一个具有良好空间局部性的程序中,被引用过一次的内存位置,那么程序很可能在不远的将来引用附近的一个内存位置。

一般而言,有良好局部性的程序比局部性差的程序运行的更快。局部性原理在应用程序中扮演着重要的角色:例如Web浏览器将最近引用的文件放在本地磁盘上,利用的就是时间局部性,大容量的Web服务器将最近被请求的文档放在前端磁盘高速缓存中,这些缓存能满足对文档的请求,而不需要服务器的干预。

这里总结一下局部性的简单原则:

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

2.对于具有步长为k的引用模式的程序,步长越小,空间局部性越好。具有步长为1的引用模式的程序有很好的空间局部性。在内存中以大步长跳来跳去的程序空间局部性会很差

3.对于取指令来说,循环有很好的时间和空间局部性。循环越小,循环迭代次数越多,局部性越好。

参考资料

《深入理解计算机系统》

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农飞飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值