我刚刚偶然发现了关于缓存算法的this blog post。
作者展示了两个代码示例,它们循环遍历一个矩形并计算一些东西(我猜计算代码只是一个占位符)。
在其中一个示例中,他垂直扫描矩形,而在另一个示例中水平扫描矩形。然后他说第二个是最快的,每个程序员都应该知道为什么。现在我一定不是一个程序员,因为对我来说它看起来完全一样。
有人能解释一下为什么前者更快吗?
发布于 2009-06-15 17:04:51
高速缓存一致性。当您水平扫描时,您的数据将在内存中更接近,因此您将有更少的缓存未命中,因此性能将更快。对于一个足够小的矩形,这并不重要。
发布于 2009-06-15 17:34:49
答案已经被接受了,但我认为这还不是全部。
是的,缓存是所有这些元素必须以某种顺序存储在内存中的重要原因。如果您按存储顺序对它们进行索引,则可能会减少缓存未命中的次数。很有可能。
另一个问题(也被许多答案提到)是几乎每个处理器都有一个非常快的整数增量指令。它们通常不会有一个非常快的“增量乘以这第二个二进制数量”。这就是你在索引“对照颗粒”时所要求的。
第三个问题是优化。已经投入了大量的精力和研究来优化这类循环,如果您以某种合理的顺序对其进行索引,那么您的编译器将更有可能实施其中的一项优化。
发布于 2009-06-15 17:27:44
缓存确实是原因,但如果你想知道争论的实质,你可以看看U.Drepper的“每个程序员都应该知道关于内存的东西”:
http://people.redhat.com/drepper/cpumemory.pdf
https://stackoverflow.com/questions/997212
复制相似问题