Computer science 在真实代码中混淆时间和空间位置
我正在读这篇文章,我想问更多关于他展示的代码,即Computer science 在真实代码中混淆时间和空间位置,computer-science,spatial,computer-architecture,temporal,Computer Science,Spatial,Computer Architecture,Temporal,我正在读这篇文章,我想问更多关于他展示的代码,即 for(i = 0; i < 20; i++) for(j = 0; j < 10; j++) a[i] = a[i]*j; (i=0;i
for(i = 0; i < 20; i++)
for(j = 0; j < 10; j++)
a[i] = a[i]*j;
(i=0;i<20;i++)的
对于(j=0;j<10;j++)
a[i]=a[i]*j;
问题是,
外环是空间局部性的一个例子。它依次递增内部循环调用的地址 内部循环演示了时间局部性。完全相同的内存地址在一行中被访问十次,每次都乘以j 至于前两个问题,i和j(循环计数器)都是时间局部性的很好例子
局部性是缓存应用的一种度量,用于最小化对内存的调用。如果一条指令需要知道缓存中不存在的内存地址的值,它将访问内存并将所有周围的内存位置也存储在缓存中 首先,对
var
的引用可以是时间局部的,也可以是空间局部的,而不是时间局部的,这是不正确的语法。小问题
现在,请回答你的问题
a[i]
经常被引用,像a[i]=a[i]*2
和a[i]=a[i]*3
这样的指令被非常紧密地执行。如果我们看这个范围,我们可以说对j
和a[i]
的引用是暂时局部的。对i
的引用在时间上也是局部的,因为每次a[i]
被引用时都会引用i
。然而,如果给定代码的最后一行读取类似于a[j]=a[j]*j
,则对i
的引用将不是暂时局部的,至少在内环[1]的范围内是如此a[i]
的引用就是一个很好的例子,因为(大多数情况下)可以假设a[0]
和a[1]
在内存中相邻[1] -通常,当您谈论局部性时,它将位于内存层次结构中给定级别的上下文中,无论是RAM还是一级缓存,或者您拥有的其他级别。除了最有限的意义外,对
i
和j
的引用在时间上都是局部的。写下这个答案,因为我甚至在阅读了关于这个问题的其他答案、一些其他问题和维基百科(这更让人困惑)之后都没有得到答案
我认为我们花费了大量的时间和精力来理解术语,在这种情况下,术语有点混乱/复杂。当我不注意“空间”和“时间”这两个术语时,我发现更容易理解
让我们从基础开始
让我们试着理解缓存是什么——一个比主内存更快访问的地方。那很酷。但是这个地方有限而且昂贵,所以人们应该明智地使用它。但是,您(或操作系统)如何决定将哪些内容放入缓存,哪些不放入缓存?应该有办法知道我们将来需要什么。。啊,未来的预测!(少数派报告!敲响警钟?)
应该有某种方法来确定该计划未来需要什么。使用常识和代码,我们可以说代码的某些部分本质上是重复的-示例-循环!若在一个循环中有一个变量i,你们知道在不久的将来它会被一次又一次地访问。这就是时间局部性背后的原理。我可以被带到缓存中,因为它是临时本地的
在另一个领域,如果代码使用任何线性数据结构(例如:数组),并且该结构也在索引中增加的循环中,那么很容易看出,尽管当前需要的只是该数据结构的第三个位置(例如),很快还需要下一个位置,因为该线性数据结构的索引增加了1。因此,如果我们也能在接下来的几个地点提供数据,那就太好了。这就是空间位置背后的原理。接下来的几个位置可以带到缓存中,因为它们特别是本地的
局部性的概念基本上是识别引入缓存的数据和指令,以减少缓存未命中并有效利用这个特殊位置 让我们从定义时间和空间位置开始 时态局部性-时态局部性意味着可能很快需要当前正在获取的数据或指令。因此,我们应该将数据或指令存储在高速缓存中,这样我们就可以避免在主内存中再次搜索相同的数据,从而节省时间 空间局部性-空间局部性意味着在不久的将来可能需要接近当前正在提取的内存位置的指令或数据
sum = 0;
for (i = 0; i < arr.length; i++)
sum += arr[i];
return sum;
sum=0;
对于(i=0;i
现在看这个例子,这里的变量sum是b
for(i = 0; i < 20; i++)
for(j = 0; j < 10; j++)
a[i] = a[i]*j;