这张桌子试图传达什么?为什么顺序读取比随机读取更快?

时间:2016-01-06 07:20:11

标签: performance caching memory

我在数据处理和大数据的背景下看到了这个表。

strange table

实际测量的条形码是多少?用于读取的设备的机制总是具有相同的速度:例如,它并不像硬盘驱动器那么认为这样,这个数据是连续的,所以我会增加磁头读取的数量"。

有人告诉我这是因为缓存,但如果它是负责的缓存,那么实际的读取速度会更快,这有点误导。是否会发生这种情况是因为整个页面从二级存储加载到主页面,如果它的顺序比页面的大部分页面将被使用那么它是否是随机的?这似乎是一个非常学术性的观点。

我不确定是否应该将此问题发布在上一段之上,但我们是否在讨论1)设备读取内容需要多长时间,2)设备需要多长时间读取内容并将其传递到内存层次结构中的下一级别,3)或设备读取内容并将其传递给处理器需要多长时间?想想看,我不确定前两者之间有什么区别:比如你有一个读取速度为x的SSD和读取速度为y的RAM。然后,对于要加载到ram中的内容,是(x+y)*size_of_page时间还是仅x*size_of_page?显然,长期以来有很多不同的缓存:硬盘驱动器have a buffer,我不知道SSD是否存在,任何CPU都可以拥有L1,L2或任意数量的缓存。这个表似乎需要更多的解释。

2 个答案:

答案 0 :(得分:1)

我们正在谈论请求数据的处理器和处理器获取所请求数据之间经过了多长时间。这涉及几个步骤,具体取决于内存架构和读取策略(通过旁视等等)

如果数据在缓存中可用,则处理器获取所请求数据的时间较短。这是因为与主存储器访问相比,缓存访问速度非常快。

当处理器请求一些数据值(比如一个整数),并且数据不存在于缓存中时,它从主存储器进入缓存,然后从缓存中提供给处理器。但是,整数不是唯一带入缓存的数据。整个缓存行(例如,可能是128个字节)被带入缓存。

现在让我们看看两种情况:

顺序访问 只有获取 first 值才需要主内存访问,因为存储在靠近此位置的内存位置(因此属于同一页面)的值都会在第一次内存访问期间加载到缓存中。因此,随后的数据请求将更快地发生,因为数据将出现在缓存中,并且每次都不会出现缓存未命中。

随机访问 在这种情况下,几乎所有数据请求(不仅仅是第一个)都会出现高速缓存未命中,因为数据是从随机存储器位置访问的,而不是连续的存储器位置。

这就是编写此代码的原因:

for(i = 0; i < 10; i++) {
  for(j = 0; j < 10; j++) {
     cout<<array[i][j];
  }
}

而不是这段代码:

for(i = 0; i < 10; i++)  {
  for(j = 0; j < 10; j++) {
     cout<<array[j][i];
  }
} 

答案 1 :(得分:1)

有两个相关的影响正在发挥作用。

第一个也是主要的影响是,所提到的3个位置的所有数据传输都发生在大于单个整数值的块中。从HDD或SSD到主存储器,块大小通常为4kB或更大(文件系统簇大小)。从主存储器到高速缓存,数据传输通常为64-256字节(高速缓存行大小)。

第二个影响因为大多数访问都是顺序访问,因此存储已针对此进行了优化。硬盘文件系统连续存储文件,因此硬盘读取头不需要移动以获取下一个群集。磁盘只是旋转。只需一次旋转,头部就会移动一步。相比之下,随机 seek 需要几毫秒。但即使SSD必须等待新地址,而对于顺序读取,下一个地址可以预测