我在几个地方读到过,在处理图像的像素时,建议您循环遍历 Y 像素,然后循环 X 像素,因为它更有可能提高内存效率。为什么会这样?
问问题
167 次
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 回答