计算机术语局部性,【计算机基础】程序的局部性简介

什么是局部性?

局部性分类

局部性有什么作用?

局部性举例数据引用的局部性

取指令的局部性

结论

完整代码

什么是局部性?

程序倾向于使用它们最近使用的地址接近或相等的数据和指令。

局部性分类

局部性主要分为时间局部性和空间局部性。

时间局部性:最近使用过的数据和指令在不久的将来可能再次被使用。具体如下图所示。

c29614eb8c7f2afa2ce7b63cb0114e7c.png时间局部性

空间局部性:某个地址或者某个地址附近的数据和指令可能在不久的将来再次被引用。具体如下图所示。

5101f8419b8e2325a2b346fd135cb4c9.png空间局部性

局部性有什么作用?

在现代计算机的软硬件中,处处体现着局部性原理。在硬件上,计算机通过引入称为高速缓存来保存最近被使用的指令和数据。在软件上,操作系统用主存来缓存磁盘文件系统中最近被使用的磁盘块。在应用程序的设计中,Web浏览器将最近被引用的文档放在本地磁盘上,利用的就是时间局部性。作为程序员应该理解局部性原理,一般来说,有良好局部性的程序比局部性差的程序运行得更快。

局部性举例

数据引用的局部性

看下下面两个函数。都是计算数组a的和。唯一的区别在于行列的访问先后顺序不同。那么这两个程序运行起来会有什么差别呢?我们测试下。/**

* @Description: 行优先方式求二维数组a的和

* @Param:       整型数组a

* @Return:      数组a的和sum

* @Author:      嵌入式与Linux那些事

*/

int SumArrRow(int aarr[ROW][COL]){

//1393.166487us

int i,j,sum = 0;

for(i = 0;i 

for(j = 0;j 

sum +=a[i][j];

printf("%d\r\n",sum);

return sum;

}/**

* @Description: 列优先方式求二维数组a的和

* @Param:       整型数组a

* @Return:      数组a的和sum

* @Author:      嵌入式与Linux那些事

*/

int SumArrCol(int a[ROW][COL]){

//2083.776579us

int i,j,sum = 0;

for(j = 0;j 

for(i = 0;i 

sum +=a[i][j];

printf("%d\r\n",sum);

return sum;

}

运算的数组为2 * 3大小。测试结果如下。15

SumArrRow run_time:1039.612803us15

SumArrCol run_time:2011.529889us

SumArrCol函数的运行时间是SumArrRow运行时间的将近2倍。原因是什么呢?

首先我们要知道数组在内存中是以行优先的方式存储的。SumArrRow函数在for循环中访问a的顺序如下。地址       0     4      8      12    16    20

内容       a00   a01    a02    a10   a11   a12

访问顺序    1     2      3     4      5      6

而SumArrRow函数中,双重嵌套循环按照行优先顺序读数组的元素。也就是,内层循环读第一行的元素,然后读第二行,依此类推。元素被访问的步长为1。和数组在内存中的存储方式是一样的,因此具有很好的空间局部性。

SumArrCol函数和SumArrRow函数,唯一的区别是我们交换了i和j的循环。这样交换循环对它的局部性有何影响?因为它按照列顺序来扫描数组,而不是按照行顺序。因为C数组在内存中是按照行顺序来存放的,元素被访问的步长为COL。所以其空间局部性较差。

SumArrCol函数在内存中的存放方式如下所示。地址       0     4      8      12    16    20

内容       a00   a01    a02    a10   a11   a12

访问顺序    1     3      5      2     4      6

下面再看一个时间局部性的例子。/**

* @Description: 求一维数组a的和

* @Param:       整型数组a

* @Return:      数组a的和sum

* @Author:      嵌入式与Linux那些事

*/

int SumArr(int a[MAX]){

int i,sum = 0;

for(i = 0;i 

sum +=a[MAX];

printf("%d\r\n",sum);

return sum;

}

SumArr单函数,它对一个向量的元素求和。这个程序有良好的局部性吗?要回答这个问题,我们来看看每个变量的引用模式。地址       0     4      8      12    16    20

内容       a0    a1     a2     a3    a4    a5

访问顺序    1     2      3      4     5      6

在这个例子中,变量sum在每次循环迭代中被引用一次,因此,对于sum来说,有好的时间局部性。另一方面,因为sum是标量,对于sum来说,没有空间局部性。

数组a的元素是被顺序读取的,一个接一个,按照它们存储在内存中的顺序(为了方便,我们假设数组是从地址0开始的)。因此,对于数组a,函数有很好的空间局部性,但是时间局部性很差,因为每个数组元素只被访问一次。对于循坏体中的每个变量,这个函数要么有好的空间局部性,要么有好的时间局部性,所以我们可以断定 SumArr函数有良好的局部性。

取指令的局部性

因为程序的指令是放在内存中的,程序运行时,CPU必须取出这些指令。SumArr中for循环体中的指令是按照连续的内存顺序执行的。因此具有很好的空间局部性。而且,循环体又被执行很多次,所以也有很好的时间局部性。取指令的局部性和数据引用的局部性的区别在于,在程序运行时,指令是不可修改的。程序只能对指令读。

结论

上面我们介绍了局部性的概念,并给出了程序示例。现将以上内容总结如下。重复引用相同变量的程序有良好的时间局部性。

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

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

完整代码/*

* @Description: 【计算机基础】程序的局部性简介

* @Version: V1.0

* @Autor: 嵌入式与Linux那些事

* @Date: 2020-12-21 21:40:12

* @LastEditors: 嵌入式与Linux那些事

* @LastEditTime: 2020-12-23 23:11:58

*/

#include 

#include 

#include 

#define ROW  2

#define COL  3

/**

* @Description: 行优先方式求数组a的和

* @Param:       整型数组a

* @Return:      数组a的和sum

* @Author:      嵌入式与Linux那些事

*/

int SumArrRow(int aarr[ROW][COL]){

//1393.166487us

int i,j,sum = 0;

for(i = 0;i 

for(j = 0;j 

sum +=a[i][j];

printf("%d\r\n",sum);

return sum;

}

/**

* @Description: 列优先方式求数组a的和

* @Param:       整型数组a

* @Return:      数组a的和sum

* @Author:      嵌入式与Linux那些事

*/

int SumArrCol(int a[ROW][COL]){

//2083.776579us

int i,j,sum = 0;

for(j = 0;j 

for(i = 0;i 

sum +=a[i][j];

printf("%d\r\n",sum);

return sum;

}

/**

* @Description: 求一维数组a的和

* @Param:       整型数组a

* @Return:      数组a的和sum

* @Author:      嵌入式与Linux那些事

*/

int SumArr(int arr[MAX]){

int i,sum = 0;

for(i = 0;i 

sum +=a[MAX];

printf("%d\r\n",sum);

return sum;

}

int main(){

int a[ROW][COL] = {0,1,2,3,4,5};

double run_time;

LARGE_INTEGER time_start; //开始时间

LARGE_INTEGER time_over; //结束时间

double dqFreq;  //计时器频率

LARGE_INTEGER f; //计时器频率

QueryPerformanceFrequency(&f);

dqFreq=(double)f.QuadPart;

QueryPerformanceCounter(&time_start); //计时开始

SumArrRow(a);

QueryPerformanceCounter(&time_over); //计时结束

run_time=1000000*(time_over.QuadPart-time_start.QuadPart)/dqFreq;//乘以1000000把单位由秒化为微秒,精度为1000 000/(cpu主频)微秒

printf("\nSumArrRow run_time:%fus\n",run_time);

return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卫星还在“织网” 北斗时代尚需时日

来源:科技日报 作者:付丽丽生活在大都市里的人们,出门如果没有手机导航,会感觉自己像盲人一样不会走路。而让人更无法忍受的,则是傻导航的瞎导乱导,“我就老跟导航吵架,气得我把手机摔了的心都…

Python3.5 queue 模块详解 和 进程间通讯

queue — A synchronized queue class:https://docs.python.org/3/library/queue.html 菜鸟教程 - Python3 多线程:http://www.runoob.com/python3/python3-multithreading.html python3 队列:https://cloud.tencent.com/developer/informa…

5大洲,32个国家:剑桥分析公司的触角到底有多远?

来源: 资本实验室 作者:王进据Facebook最新披露的信息,剑桥分析公司(Cambridge Analytica)经由Facebook平台泄露数据影响的用户数量从5000万增加到8700万。其中,美国占比81.6%,也就…

计算机房的分类,雅思词汇分类积累之计算机房

雅思词汇在雅思考试中占据着很重要的位置,是各部分考试的基础,今天新东方在线小编给大家整理了雅思词汇分类积累之计算机房,希望能够帮助大家顺利的通过考试,一起来看看吧!硬件mainframe主机,monitor监视器,显示器,scr…

CSRF攻击与防御(写得非常好)

From:https://www.daguanren.cc/post/csrf-introduction.html From:https://blog.csdn.net/stpeace/article/details/53512283 CSRF 攻击的应对之道:https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf WEB三大攻击之—CSRF攻击与…

使用AvalonDock制作WPF多标签浏览器(一)

AvalonDock是CodePlex上的一个开源项目,利用它可以很容易的做出类似于VS的UI效果。下图是AvalonDock源码中自带的一个Demo:我们可以用这款第三方控件为基础来制作多标签浏览器。下面是最终效果图:甚至可以把其中一个标签拖出主窗体成为一个独…

量子计算机不会“秒杀”经典计算机

来源:《中国科学报》 作者:陈昭昀许多人在介绍量子计算机的时候,都喜欢用到“秒杀”这个词。比如:量子计算机将“秒杀”现有密码体系、量子计算机将“秒杀”经典计算机,甚至将量子计算机比作无所不能的“千手观音”&a…

WEB三大攻击之—SQL注入攻击与防护

From:https://www.daguanren.cc/post/sql-injection.html SQL注入的定义与诱因 定义 SQL攻击(英语:SQL injection),简称注入攻击,是发生于应用程序之数据库层的安全漏洞。简而言之,是在输入的…

Yoshua Bengio团队通过在网络「隐藏空间」中使用降噪器以提高深度神经网络的「鲁棒性」...

原文来源:arXiv 作者:Alex Lamb、Jonathan Binas、Anirudh Goyal、Dmitriy Serdyuk、Sandeep Subramanian、Ioannis Mitliagkas、Yoshua Bengio「雷克世界」编译:嗯~是阿童木呀、KABUDA、EVA导语:深度神经网络在各种各样的重要任…

在视图中显示InActive记录

最近很多朋友(Andrew、BENEN1)都在问如何让Lookup显示InActive记录,研究后发现可以通过Plugin来实现这样的功能,MSCRM真是无所不能,没有做不到,只有想不到!实现步骤:一、自定义实体->工程项目->表单和视图->查找视图->…

计算机网申兴趣爱好怎么写,网申简历中的特长爱好到底怎么写

原标题:网申简历中的特长爱好到底怎么写?2017年安徽农商银行招聘920人报名已经进行了几天了.在报名的过程中,有很多小伙伴不知道网申时的特长爱好怎么写.那么,不论是在网申还是在求职过程中的简历特长爱好到底要怎么写呢?加备考群 免费领资料 626394893下…

OpenAI 发布通用人工智能研究纲领:以全人类的名义承诺

作者:杨晓凡近期 Facebook 泄露用户数据、针对性影响用户、Uber 无人车事故,以及全球学者联名抵制韩国开发自主武器的事情再次敲响了人工智能安全的警钟。OpenAI 也于昨日发表了一份自己的研究纲领, 表明了自己的科研使命和行动法则&#xff…

基于深度学习的性别识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 GoogLeNet网络结构 4.2. 基于GoogLeNet的性别识别算法 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..............................…

李飞飞:让机器有分辨事物的“眼睛”

来源:中国新闻网很难有一项科技的发展像人工智能一样令人既期待又不安。若机器拥有了“自主意识”,人类将面对一个怎样的世界?在各类科幻作品中,人们的探讨层出不穷。和天马行空的文学想象不同,有着“AI女神”之称的华…

Java Web开发技术详解~MIME类型

MIME(Multipurpose Internet Mail Extension)是指多用途网络邮件扩展协议,这里的邮件不单纯值E-Mail,还可以包括通过各种应用层协议在网络上传输的数据。 遵守MIME协议的数据类型统称为MIME类型。在HTTP请求头和HTTP响应头中都有一…

Microsoft Visual Studio Code

Microsoft Visual Studio Code 中文手册:https://code.visualstudio.com/docs 官方快捷键大全:https://code.visualstudio.com/docs/customization/keybindings 第一次使用 VS Code 时你应该知道的一切配置:https://zhuanlan.zhihu.com/p/62…

利用HoloLens进行无人船舶驾驶!微软日本概念视频

来源:新浪游戏,AR联盟等平台微软日本公司最近推出一个新的概念视频,它展示了HoloLens将如何在相对不久的将来用于自动船舶驾驶上。尽管HoloLens主要是面向开发者和研究人员,但这项设备是站在向我们展示AR潜能的最前沿。最新的例子…

teamviewer企业版 添加计算机,teamviewer添加常用控制电脑列表的操作步骤

最近有不少的teamviewer用户们,会询问小编怎么teamviewer今日在这篇文章内小编就为你们带来了teamviewer添加常用控制电脑列表的操作步骤。teamviewer添加常用控制电脑列表的操作步骤首先我们注册一个TeamViewer账号:当我们注册账号后在右边登陆&#xf…

Spring Data JPA 从入门到精通~@EntityListeners注解示例

被Prepersist注解的方法 ,完成save之前的操作。 被Preupdate注解的方法 ,完成update之前的操作。 被PreRemove注解的方法 ,完成remove之前的操作。 被Postpersist注解的方法 ,完成save之后的操作。 被Postupdate注解的方法 &#…

干货|重磅发布:人工智能行业应用价值报告(PDF报告下载)

来源:机器人大讲堂报告下载:https://pan.baidu.com/s/1QEUOHqhQvxs9hEY6NLzPPg未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括:建立AI智能系统智商评…