5

我在几个地方读到过,在处理图像的像素时,建议您循环遍历 Y 像素,然后循环 X 像素,因为它更有可能提高内存效率。为什么会这样?

4

2 回答 2

5
A1 A2 A3 A4 
B1 B2 B3 B4 
C1 C2 C3 C4 
D1 D2 D3 D4 

假设那是您的图像(以及它的点的某种坐标),它将以字符串的形式存储在内存中,就像:

A1 A2 A3 A4 B1 B2 B3 B4 C1 C2 C3 C4 D1 D2 D3 D4.

让我们模拟这些选项:

对于 X,然后是 Y:

A1 B1 C1 D1 A2 B2 C2 D2 A3 B3 C3 D3 A4 B4 C4 D4 

现在检查字符串,这些访问会有多混乱(就像随机读取一样,对吗?)

也不是,对于 Y,然后是 X

A1 A2 A3 A4 B1 B2 B3 B4 C1 C2 C3 C4 D1 D2 D3 D4

看?直接阅读!

这就是为什么。

于 2013-10-07T01:46:40.583 回答
4

图像中的像素先从左到右存储,再从上到下存储。
就像书中的字母一样。首先从上到下阅读一页中的每个字母并因此慢慢重构句子会很累。

不要对机器工作
它更快的原因是因为 CPU 以“从左到右”的顺序将数据读入其缓存。通常一次将 8 或 16 个字节写入cache line.
如果您以相同的顺序处理该数据,则比“从上到下”扫描数据效率高得多,CPU 会将大量数据读入缓存中,这些数据在被覆盖之前不会被使用。

这将导致 CPU 不得不重新读取缓存中的相同数据,从而浪费时间。

推测性读取
此外,如果您从左到右读取,CPU 可以预期进一步的读取,并将主动将数据放入缓存中,以跟上您的读取速度。如果您遵循任何其他顺序,它会将您的访问声明为“随机”并且不会打扰。

在维基百科中查找cache lines

使用缓存是关键
请注意,此“规则”不仅适用于图像,还适用于计算机中的所有数据。
到目前为止,缓存未命中是大多数应用程序中最大的时间消耗者。

于 2013-10-07T01:38:28.480 回答