C语言编程之局部性
什么是局部性
一个编写良好的计算机程序常常具有良好的局部性(locality)。即,他们倾向于引用临近与其最近引用过的数据项的数据项,或者最近引用过的数据项本身。这种倾向性,被称为 局部性原理 。
局部性通常有两种不同的形式: 时间局部性
具有良好时间局部性的程序中,被引用过一次的内存位置很可能在不远的将来再被多次引用。 空间局部性
具有良好空间局部性的程序中,如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用附近的一个内存位置。 局部性原理的应用
一般来说,有良好局部性的程序比局部性差的程序运行得更快。
现代计算机系统的各个层次,从硬件到操作系统、再到应用程序,它们的设计都利用了局部性。 硬件层
局部性原理允许计算机设计者通过引入称为高速缓存存储器,来保存最近被引用得指令和数据项,从而提高对主存的访问速度。 操作系统层
局部性原理允许系统使用主存来缓存磁盘文件系统中最近被使用的磁盘块。 应用程序
局部性原理在应用程序的设计中也扮演着重要角色。例如,Web浏览器将最近被引用的文档放在本地磁盘上。 对程序数据引用的局部性
通过举例来说明程序的局部性 int sumvec(int v[N]) { int i, sum = 0; for(i = 0; i < N; i++) { sum += v[i]; } return sum; }
在这段程序代码中,变量 sum 在每次循环迭代中被引用一次,对于 sum 来说,有好的时间局部性。另外,sum 为标量,没有空间局部性。
向量 v 的元素是被顺序读取的,按照它们存储在内存中的顺序一个接一个。对于变量 v ,函数具有很好的空间局部性,但是时间局部性很差。因为每个向量元素只被访问一次。
对于循环体来说,其中的每个变量,要么有好的空间局部性,要么有好的时间局部性。由此断定函数 sumvec 有良好的局部性。
顺序访问一个向量每个元素的函数,具有步长为 1 的引用模式。每隔 k 个元素访问一个连续向量,就称为步长为 k 的引用模式。 一般来说,随着步长的增加,空间局部性下降。
多维数组访问举例,二维数组求和,双重嵌套按照行优先顺序: int sumarrayrows(int a[M][N]) { int i, j, sum = 0; for(i = 0; i < M; i++) { for(j = 0; j < N; j++) { sum += a[i][j]; } } return sum; }
这个函数按照数组被存储的 行优先顺序 来访问这个数组,是一个以步长为 1 的引用模式,具有良好的空间局部性。
如果是以 列优先顺序 进行访问这个数组,for 循环修改为 for(j = 0; j < N; j++) { for(i = 0; i < M; i++) { sum += a[i][j]; } }
这个循环是按照 列优先顺序 扫描数组,而C语言的数组在内存中是按照 行顺序 来存放的。结果得到步长为 N 的引用模式,导致这个循环的空间局部性很差。 取指令的局部性
程序的指令是存放在内存中的,CPU 必须取出这些指令,因此也可以评价一个程序关于取指令的局部性。
for 循环体里的指令是按照连续的内存顺序执行的,因此循环具有良好的空间局部性。
循环体会被执行多次,因此,它也有很好的时间局部性。 小结
量化评价程序中局部性的一些简单原则为: 重复引用相同变量的程序有良好的时间局部性 对于具有步长为 k 的引用模式的程序,步长越小,空间局部性越好。具有步长为 1 的引用模式的程序,具有很好的空间局部性。在内存中以大步长跳来跳去的程序,空间局部性会很差。 对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
参考资料:《深入理解计算机系统》
在AI和ML领域,Python是不是地表最强?人工智能(AI)和机器学习(ML)是IT行业的新秀。在对其开发安全性的讨论不断升级的同时,开发人员也在扩展人工智能的能力和容量。人工智能被广泛用于处理和分析大量数据,有助于处理由于
AI开发者指南丨如何正确理解神经网络和深度学习?神经网络定义神经网络是一组算法,可以模仿人脑,旨在识别其模式。它们通过一种机器感知标记或聚类原始输入来解释感官数据。他们识别的模式是包含在向量中的数字,无论是图像声音文本还是时间序
科普20位的国标编码,分别都代表什么?经常遇到网友问GB28181中国标编码的含义,今天为大家统一做一个整理。目前TSINGSEE青犀视频团队开发的EasyGBS和EasyCVR已经实现完全对接GB28181协议的设备
2021行业白皮书AI将彻底改变视频监控市场格局视频监控新增长点出现,行业竞争更加激烈随着国家大力建设雪亮工程平安城市布局新基建战略,以视频监控网络为基础的智能安防平台,为视频图像分析技术计算机视觉自然语言处理等人工智能技术提供
国外AI工程师讲述深度学习与目标检测,理论和实践果然两码事背景故事2018年,当时我在工厂实习,我开始研究目标检测技术,因为我需要解决视觉检测问题。这个问题需要在来自工业相机的图像流中检测许多不同的物体目标。为了应对这一挑战,我首先尝试将
程序员10个入门级的机器学习开源项目要开始为开源项目做贡献,有一些先决条件1。学习一门编程语言由于在开源贡献中你需要编写代码才能参与开发,你需要学习任意一门编程语言。根据项目的需要,在后期学习另一种语言很容易。2。熟
AI视频分析技术是如何工作的?原理是什么?什么是实时AI视频分析技术?实时AI视频分析是一种基于人工智能的技术,可分析视频流以检测特定行为和事件的展开。这种类型的系统通过人工智能机器学习引擎检查来自监控摄像头的视频流来进行
一文看懂人工智能的专业术语,你知道几个?人工智能(AI)机器学习(ML)深度学习(DL)神经网络(CNN)这些术语通常可以互换使用,但有它们之间都有什么区别?如何区分它们?AI技术正越来越深入我们的日常生活,为了跟上消费
如何提取MV中的音频添加到直播中做BGM?EasyNVR已经支持自定义上传音频文件,可以做慢直播场景使用,前两天有一个开发者提出一个问题想把一个MV中的音频拿出来放到EasyNVR中去做慢直播。当时想法很简单,直接到网上去
AI智能视觉检测技术是如何实现的?在现实生活中有哪些应用?制造业中的AI智能是一个时髦的术语。在描述基于人工智能的缺陷检测解决方案时,通常是关于某种基于深度学习和计算机视觉的视觉检测技术。什么是视觉检测中的深度学习?深度学习是机器学习技术
科技养老,如何让社区养老更有温度?我国人口老龄化呈现出老年人口规模大老龄化进程快城乡老龄化水平差异明显老年人快速增长的特点。十四五规划和2035年愿景框架提出,应构建社区卫生保健与医疗保健协调的老年社区服务体系,以