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都要差。

时间: 2024-12-08 00:24:04

CSAPP:局部性原理的相关文章

局部性原理的点滴应用场景 use of localityprinciple

话说九月份博士入学面试的时候被问到了一个问题:请说明一下局部性原理在计算机科学中的应用场景?(哈哈,不记得怎么问的了,大概是这个意思)但是巴拉巴拉整半天却也只说出了一个Cache,后来补充的也都是跟Cache相关的,就是没能跳出Cache,哎~~于是就想写这个博客了,但是苦于涉及的面实在太广,于是乎,遇到一个写一个吧. 首先,Cache肯定算一个,设计Cache也是为了性能考虑,主要是为了解决内存和磁盘之间的速度差问题,而将近期访问的一部分数据保存在内存中以便下次直接可以提取,从而加速.围绕Ca

程序的局部性原理2

当CPU发出写操作命令时,也要根据它产生的主存地址分为两种情形:一种是不命中时,只向主存写入信息,不必同时把这个地址单元所在的整块内容调入Cache中:另一种是命中时,这时会遇到如何保持Cache与主存的一致性问题,通常有三种处理方式: 1.直写式(write through)即CPU在向Cache写入数据的同时,也把数据写入主存以保证Cache和主存中相应单元数据的一致性,其特点是简单可靠,但由于CPU每次更新时都要对主存写入,速度必然受影响. 2.缓写式(post write)即CPU在更新

程序的局部性原理

程序的局部性原理 :是指程序在执行时呈现出局部性规律,即在一段时间内,整个程序的执行仅限于程序中的某一部分.相应地,执行所访问的存储空间也局限于某个内存区域. 局部性原理又表现为:时间局部性和空间局部性.时间局部性是指如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执行;如果某数据被访问,则不久之后该数据可能再次被访问.空间局部性是指一旦程序访问了某个存储单元,则不久之后.其附近的存储单元也将被访问. 另外,根据程序的局部性理论,Denning提出了工作集理论.所谓工作集是指进程运行时被

局部性原理与高速缓存

http://blog.csdn.net/gaolinjie/article/details/4597356 局部性原理(Principle of Locality)是一个由经验得出的结论:"一个程序90%的时间运行在10%的代码上". 计算机程序从时间和空间都表现出"局部性": 1)时间的局部性(Temporal Locality):最近被访问的内存内容(指令或数据)很快还会被访问: 2)空间的局部性(Spatial Locality):靠近当前正在被访问内存的内

缓存机制与局部性原理

http://www.cnblogs.com/jqctop1/p/4714116.html 1. 局部性原理 局部性原理是指计算机在执行某个程序时,倾向于使用最近使用的数据.局部性原理有两种表现形式:时间局部性和空间局部性. 时间局部性是指被引用过的存储器位置很可能会被再次引用,例如:重复的引用一个变量时则表现出较好的时间局部性 空间局部性是指被引用过的存储器位置附近的数据很可能将被引用:例如:遍历二维数组时按行序访问数据元素具有较好的空间局部性 2. 缓存与缓冲 缓冲通常在接收者和发送者速度差

程序性能优化-局部性原理

更多文章 概念 一个编写良好的计算机程序常常具有良好的局部性,它们倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身,这种倾向性,被称为局部性原理.有良好局部性的程序比局部性差的程序运行得更快. 局部性通常有两种不同的形式: 时间局部性 在一个具有良好时间局部性的程序中,被引用过一次的内存位置很可能在不远的将来被多次引用. 空间局部性 在一个具有良好空间局部性的程序中,如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用附近的一个内存位置. 时间局部性示例 fun

程序访问的局部性原理---进行科学性验证

就是要你懂Java中volatile关键字实现原理

原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用. 本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,在此之前,有必要讲解一下CPU缓存的相关知识,掌握这部分知识一定会让我们更好地理解volatile的原理,从而更好.更正确地地

B+/-Tree原理

B-Tree介绍 B-Tree是一种多路搜索树(并不是二叉的):       1.定义任意非叶子结点最多只有M个儿子:且M>2:       2.根结点的儿子数为[2, M]:       3.除根结点以外的非叶子结点的儿子数为[M/2, M]:       4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字:(至少2个关键字)       5.非叶子结点的关键字个数=指向儿子的指针个数-1:       6.非叶子结点的关键字:K[1], K[2], -, K[M-1]:且K[i]