CSAPP:局部性原理
一个编写良好的计算机程序常常具有良好的局部性(locality)。局部性通常有两种不同的形式:时间局部性(temporal locality)和空间局部性(spatial locality)。在一个具有良好时间局部性的程序中,被引用过一次的内存位置很可能在不远的将来再被多次引用。在一个具有良好空间局部性的程序中,如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用附近的一个内存位置。
评价程序局部性的一些简单原则有如下几条:
- 重复引用相同变量的程序有良好的时间局部性。
- 对于具有步长为m的引用模式的程序,步长越小,空间局部性越好。具有步长为n的引用模式的程序有很好的空间局部性。在内存中以大步长跳来跳去的程序空间局部性会很差。
- 对于取值令来说,循环有好的时间局部性和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
对以上原则的具体实例分析:

从中,我们可以看出,变量sum在每次循环迭代中被引用一次,因此,对于sum来说,有好的时间局部性。另一方面,因为sum是标量,对于sum来说,没有空间局部性。但是,向量v的元素是被顺序读取的,按照它们存储在内存中的顺序(假设数组是从地址0开始)。因此,对于向量v,函数有很好的空间局部性,但是时间局部性很差,因为每个向量元素只被访问一次。从整个循环体来看,循环体中的每个变量,这个函数要么有好的空间局部性,要么有好的时间局部性,所以我们可以断定sumvec函数有良好的局部性。
我们称像sumvec这样顺序访问一个向量每个元素的函数,具有步长为1的引用模式。有时我们称步长为1的引用模式为顺序引用模式。一个连续向量中,每隔k个元素进行访问,就称为步长为k的引用模式。一般而言,随着步长的增加,空间局部性下降。
对于引用多维数组的程序来说,步长也是一个很重要的问题。


二者的区别在于我们交换了 i 和 j 的循环,但是就是这么一个小的改动,能对其局部性有很大的影响。
例题分析:
void clear1(point *p,int n)
{
int i,j; for (i = 0;i < n;i++)
{
for (j = 0;j < 3;j++)
p[i].vel[j] = 0;
for (j = 0;j < 3;j++)
p[i].acc[j] = 0;
}
} void clear2(point *p,int n)
{
int i,j;
for (i = 0;i < n;i++)
{
for (j = 0;j < 3;j++)
{
p[i].vel[j] = 0;
p[i].acc[j] = 0;
}
}
} void clear3(point *p,int n)
{
int i,j;
for (j = 0;j < 3;j++)
{
for (i = 0;i < n;i++)
p[i].vel[j] = 0;
for (i = 0;i < n;i++)
p[i].acc[j] = 0;
}
}
单从空间局部性(不考虑复杂度等问题)对这三个函数排序,容易得出函数clear1以步长为1的引用模式访问数组,因此明显地具有最好的空间局部性。函数clear2依次扫描N个结构中的每一个,但是在每个结构中,它以步长不为1的模式跳到下列相对于结构起始位置的偏移处:0、12、4、16、8、20.所以clear2的空间局部性比clear1的要差。函数clear3不仅在每个结构中跳来跳去,而且还从结构跳到结构,所以lcear3的空间局部性比clear2和clear1都要差。
CSAPP:局部性原理的更多相关文章
- 磁盘文件I/O,SSD结构,局部性原理 笔记
磁盘文件I/O过程 进程向内核发起read scene.dat请求: 内核根据inode获取对应该进程的address space,在address space查找page_cache,如果没有找到, ...
- 局部性原理的点滴应用场景 use of localityprinciple
话说九月份博士入学面试的时候被问到了一个问题:请说明一下局部性原理在计算机科学中的应用场景?(哈哈,不记得怎么问的了,大概是这个意思)但是巴拉巴拉整半天却也只说出了一个Cache,后来补充的也都是跟C ...
- 系统级编程(csapp)
系统级编程漫游 系统级编程提供学生从用户级.程序员的视角认识处理器.网络和操作系统,通过对汇编器和汇编代码.程序性能评测和优化.内存组织层次.网络协议和操作以及并行编程的学习,理解底层计算机系统对应用 ...
- 【转】MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- [转]MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- MySQL索引背后的数据结构及算法原理【转】
本文来自:张洋的MySQL索引背后的数据结构及算法原理 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持 ...
- MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- HBase的基本架构及其原理介绍
1.概述:最近,有一些工程师问我有关HBase的基本架构的问题,其实这个问题仅仅说架构是非常简单,但是需要理解.在这里,我觉得可以用HDFS的架构作为借鉴.(其实像Hadoop生态系统中的大部分组建的 ...
- [纯干货] MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
随机推荐
- AtCoder Beginner Contest 133-C - Remainder Minimization 2019
https://atcoder.jp/contests/abc133/tasks/abc133_c 思路:由于L,R区间太大,所以不能暴力枚举.由于求(i*j)%2019的最小值,那么2019的倍数对 ...
- 中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结
中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结 标签:数学方法--数论 阅读体验:https://zybuluo.com/Junlier/note/1300035 前置浅讲 前 ...
- ssm框架搭建整合测试
下载各种jar包 mybatis下载 https://github.com/mybatis/mybatis-3/releases mysql驱动下载 http://mvnrepository.com/ ...
- 浅析API和SDK
前言 最近有小伙伴咨询胡哥关于API和SDK的概念以及区别,今天给大家来阐述下我的理解,手动微笑.gif. API 1. 定义 API(Application Programming Interfac ...
- 如何在Set集合中避免重复元素
文章翻译自 Avoiding near-duplicates in sets, 作者Paul Hudson @twostraws是一名优秀的Swifter. 这是我第一次翻译,可能有翻译不到位的地方, ...
- chattr 改变文件的扩展属性
1. 命令功能 chattr和lsattr用来改变文件.目录属性和查看这种文件属性:chmod只是改变文件的读.写.执行权限,更底层的属性控制是由chattr来改变. 2. 语法格式 chattr [ ...
- Springboot 默认cache
1:Springboot 默认缓存为ConcurrentMapCacheManager(spring-context) 2:再启动类上开启缓存 @SpringBootApplication //相当于 ...
- 英语单词Obsolete
Obsolete 来源——命令帮助 [root@centos73 ~]# help typeset typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...
- OSS重磅推出OSS Select——使用SQL选取文件的内容
对象存储OSS(Object Storage Service)具有海量.可靠.安全.高性能.低成本的特点.OSS提供标准.低频.归档类型,覆盖多种数据从热到冷的存储需求,单个文件的大小从1字节到48. ...
- 查看window系统有哪些服务
右键点击开始菜单按钮,选择“运行”(也可以快捷键 WIN+R 打开) 在运行框中输入命令services.msc打开服务窗口 在服务窗口列出了系统的所有服务,有运行的,也有停止的,可以点击“状态”列对 ...