【编程】程序的局部性原理对代码效率的影响

简介: 【编程】程序的局部性原理对代码效率的影响

70151bd7a0480be53af131d42644a025_20200416161142938.png

局部性原理分为了时间局部性和空间局部性。

时间局部性:一条指令和下次执行,一个数据的访问和下一次访问都集中在一个较短时期内。

空间局部性:当前指令和邻近几条指令、当前访问和邻近的几个数据都集中在一个较小区域内。

分支局部性:一条跳转指令的两次执行,很可能跳到相同的内存位置

访问速度快、空间大、使用方便(不需要程序猿过多构思数据结构)

例子:

89f9b4f8a8f6644de59e046ffc59f398_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

这个整数数组的空间大小是1024x1024,int型每一个是4byte,也就说这一个数组整体会占4M的内存空间。但是物理内存只有4K。此时,

程序1:A【0】【0】~ A【1023】【0】==>A【1023】【1023】


程序2:A【0】【0】~ A【0】【1023】==>A【1023】【1023】


区别:实际上A【1】【0】和A【0】【0】从空间上来看,中间差了1024个数据也就说是4K的数据大小,但是A【1】【0】和A【1】【1】之间的距离只有一个数据也就说4byte。


那么对于程序2而言,在数据A【0】【x】占据了一个页。当他第一次访问时,数组的数据还在硬盘上时,会产生缺页异常,此时OS会把仅有的4K空间使用上,并把A【0】【x】数组放入内存空间 ,然后就可以对A【0】【x】数组进行正常访问了。根据循环,第二次访问A【0】【1】时,因为已经有了对应的页,就不会发生页异常。内循环执行完后,进入下一个内循环,此时访问A【1】【0】发生一次中断,然后接下来的1023次访问不会再发生中断。具备很好的空间局部性和时间局部性。也就意味着一共发生了1024次缺页中断


对于程序1而言,在数据A【0】【x】占据了一个页。当他第一次访问时,数组的数据还在硬盘上时,会产生缺页异常,此时OS会把仅有的4K空间使用上,并把A【0】【x】数组放入内存空间 ,然后就可以对A【0】【x】数组进行正常访问了。根据循环,第二次访问时,会访问A【1】【0】,此时会再次产生缺页异常,因为对应A【1】【x】的页仍然不在内存,在硬盘中,需要再次把4K的物理内存用到A【1】【x】数组上,此后导入A【1】【x】的页。同理,在一个内循环中,每一次都会跳4K空间去访问一个数据,每一次访问都会发生缺页异常。也就意味着一共发生了1024x1024次缺页中断

可以看出程序的不同写法对开销的影响是相当大的。


目录
相关文章
|
2月前
|
Linux 编译器 C++
C/C++性能优化:从根本上消除拷贝操作的浪费
C/C++性能优化:从根本上消除拷贝操作的浪费
56 0
|
7月前
|
缓存 算法 Cloud Native
面试技巧:如何在有限时间内优化代码性能
面试技巧:如何在有限时间内优化代码性能
31 0
|
7月前
|
测试技术
代码为啥不能过度优化
代码为啥不能过度优化
38 0
|
9月前
|
Web App开发 测试技术
程序性能优化-局部性原理
程序性能优化-局部性原理
60 0
|
10月前
如何理解ALU的优点?
ALU是组合逻辑电路!
167 0
|
安全
程序人生 - 怡宝和农夫山泉有什么区别,哪个更好一些?
程序人生 - 怡宝和农夫山泉有什么区别,哪个更好一些?
203 0
|
存储 缓存 安全
并发编程从操作系统底层工作整体认识开始
前言 在多线程、多处理器、分布式环境的编程时代,并发是一个不可回避的问题。既然并发问题摆在面前一个到无法回避的坎,倒不如拥抱它,把它搞清楚,花一定的时间从操作系统底层原理到Java的基础编程再到分布式环境等几个方面深入探索并发问题。先就从原理开始吧。 计算机系统层次结构 早期计算机系统的层次 最早的计算机用机器语言编程,机器语言称为第一代程序设计语言 现代(传统)计算机系统的层次 现代计算机用高级语言编程 第三代程序设计语言(3GL)为过程式 语言,编码时需要描述实现过程,即“ 如何做”。 第四代程序设计语言(4GL) 为非过程 化语言,编码时只需说明“做什么”, 不需要描述具体
183 0
并发编程从操作系统底层工作整体认识开始
|
缓存 Dubbo NoSQL
祖传代码如何优化性能?
今天又带来一次性能优化的分享,这是我刚进公司时接手的祖传(坏笑)项目,这个项目在我的文章中屡次被提及,我在它上面做了很多的性能优化,比如《记一次提升18倍的性能优化》这篇文章,比较偏向某个细节的优化,本文更偏向宏观上的性能优化,可以说是个老演员了。
160 0
祖传代码如何优化性能?