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

什么是局部性?

局部性分类

局部性有什么作用?

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

取指令的局部性

结论

完整代码

什么是局部性?

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

局部性分类

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

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

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:我们可以用这款第三方控件为基础来制作多标签浏览器。下面是最终效果图:甚至可以把其中一个标签拖出主窗体成为一个独…

SpringBoot 自带工具类~StreamUtils

org.springframework.util.StreamUtils 1、输入 void copy(byte[] in, OutputStream out) int copy(InputStream in, OutputStream out) void copy(String in, Charset charset, OutputStream out) long copyRange(InputStream in, OutputStream out, long start, long en…

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

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

计算机的定点运算器原理,计算机组成原理定点运算器的组成及结构.doc

计算机组成原理 第八章定点运算器的组成和结构1. 算术逻辑单元(简称ALU)? 针对每一种算术运算,都必须有一个相对应的基本硬件配置,其核心部件是加法器和寄存器。当需完成逻辑运算时,势必需要配置相应的逻辑电路, 而ALU电路是既能…

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导语:深度神经网络在各种各样的重要任…

SpringBoot 自带工具类~ReflectionUtils

org.springframework.util.ReflectionUtils 1、获取方法 // 在类中查找指定方法 Method findMethod(Class<?> clazz, String name) // 同上&#xff0c;额外提供方法参数类型作查找条件 Method findMethod(Class<?> clazz, String name, Class<?>…

在视图中显示InActive记录

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

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

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

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

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

System.Net.Mail的属性与方法集锦

邮件中的图片以插图的方式显示在邮件正文中 attachmen.ContentDisposition.Inline true;转载于:https://www.cnblogs.com/redflag/archive/2010/03/29/1699655.html

SpringBoot 自带工具类~AopUtils

org.springframework.aop.support.AopUtils 1、判断代理类型 // 判断是不是 Spring 代理对象 boolean isAopProxy() // 判断是不是 jdk 动态代理对象 isJdkDynamicProxy() // 判断是不是 CGLIB 代理对象 boolean isCglibProxy() 2、获取被代理对象的 class // 获取…

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

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

计算机科学中的逻辑学术,简述逻辑学在计算机科学中的应用

▲▲一、引言逻辑是一种思维的法则&#xff0c;也是人类认识世界、改造世界的基本准绳与工具&#xff0c;是所有的理论与学说中关于判断和思维规律的提炼、抽象。随着人类的发展&#xff0c;逻辑学已经被广泛运用到社会科学、自然科学等领域中。作为人类进行推理和判断的工具&a…