缓存位置性能

时间:2013-02-20 10:42:31

标签: c++ c performance optimization

如果我有一个C或C ++程序,我在整个程序中使用20个整数,那么它是否会提高性能以创建一个大小为20的数组来存储整数然后为每个数字创建别名?

这是否会改善缓存局部性(而不仅仅是创建20个普通整数),因为int将作为int数组的一部分一起加载到缓存中(或者至少可以提高它的可能性)?

6 个答案:

答案 0 :(得分:2)

问题是你如何为他们分配空间?我怀疑你只是在代码中随机地new int 20次。如果它们是局部变量,那么它们将进入堆栈并进行缓存。

主要问题是值得打扰吗?尝试首先以可读和优雅的方式编写程序,然后尝试消除主要瓶颈,并且只在开始搞乱微优化之后。如果你正处理20个整数,它们本质上不应该是数组吗?

这也是理论问题吗?如果是,那么是的,数组可能会比内存中的20个随机区域更好地缓存。如果这是一个实际的问题,那么我怀疑这是非常重要的,除非你正在编写超临界性能代码,即使那时微观优化也是最后要处理的事情。

答案 1 :(得分:2)

它可能会提高性能,是的。它也可能完全破坏你的表现。或者它可能没有任何影响,因为编译器已经为您做了类似的事情。或者它可能没有任何影响,因为你只是不经常使用这些整数来实现这一点。

它还取决于一个或多个线程是否访问这些整数,以及它们是仅读取还是修改数字。 (如果你有多个线程,并且你写入这些整数,那么将它们放在一个数组中会导致错误的共享,这会比你希望得到的任何东西都损害你的表现)

那你为什么不试试呢?

没有简单的答案。您将获得的唯一严重的答案是“它取决于”。如果您想知道它在您的案例中的表现,那么您有两种选择:

  1. 试一试,看看会发生什么,或者
  2. 深入了解您的CPU工作原理,收集数据的准确访问频率和模式,以便您可以对变更将如何影响您的表现进行有根据的猜测。
  3. 如果你选择#2,你可能需要用#1跟进,以验证你的猜测是否正确。

    表现并不简单。 通用规则很少,一切都取决于上下文。在一种情况下进行优化的更改可能会减慢另一种情况下的所有内容。

    如果您认真考虑优化代码,那么上述两个步骤就无法替代。如果你不认真,不要这样做。 :)

答案 2 :(得分:1)

是的,20个整数在同一个缓存行上的理论概率会更高,尽管我认为一个好的编译器几乎总能为你复制相同的性能,即使不使用数组也是如此。

答案 3 :(得分:1)

那么,你现在有int positionX, positionY, positionZ;,那么其他地方int fuzzy;int foo;等,可以制作大约20个整数?

你想做这样的事情:

int arr[20];
#define positionX arr[0]
#define positionY arr[1]
#define positionZ arr[2]
#define fuzzy     arr[3]
#define foo       arr[4]

我希望如果有任何性能差异,可能会让它变慢,因为编译器会注意到你在其他地方使用arr,因此无法使用寄存器来存储foo的值,因为它看到您调用update_position来触及arr[0]..arr[2]。这取决于编译器检测到的细微程度,我们是否接触到相同的数据"是。我怀疑它可能经常基于"对象"而不是对象的单个字段 - 特别是对于数组。

但是,如果您确实拥有一起使用的数据,例如位置变量,它们可能有助于让它们彼此相邻。

但我认真地认为你浪费时间试图将变量放在一起,并且使用数组几乎肯定是一个不好的想法。

答案 4 :(得分:1)

这可能会降低性能。当你不看时,现代编译器会在内存中移动变量,并且当它们不同时使用时,可以在同一地址存储两个变量。根据您的数组想法,这些变量不能重叠,并且必须使用不同的缓存行。

答案 5 :(得分:0)

是的,这可能会提高你的表现,但它可能不会,因为它的真正变量可以一起使用,应该存储在一起。

所以如果他们一起使用那么是的。变量和对象应该在使用它们的函数中声明,因为它们将存储在堆栈中(大多数情况下为1级缓存)。

所以是的,如果你要一起使用它们,即它们彼此相关,那么这可能会更有效率,这也证明你也考虑了如何分配它们。