如果我有一个C或C ++程序,我在整个程序中使用20个整数,那么它是否会提高性能以创建一个大小为20的数组来存储整数然后为每个数字创建别名?
这是否会改善缓存局部性(而不仅仅是创建20个普通整数),因为int将作为int数组的一部分一起加载到缓存中(或者至少可以提高它的可能性)?
答案 0 :(得分:2)
问题是你如何为他们分配空间?我怀疑你只是在代码中随机地new int
20次。如果它们是局部变量,那么它们将进入堆栈并进行缓存。
主要问题是值得打扰吗?尝试首先以可读和优雅的方式编写程序,然后尝试消除主要瓶颈,并且只在开始搞乱微优化之后。如果你正处理20个整数,它们本质上不应该是数组吗?
这也是理论问题吗?如果是,那么是的,数组可能会比内存中的20个随机区域更好地缓存。如果这是一个实际的问题,那么我怀疑这是非常重要的,除非你正在编写超临界性能代码,即使那时微观优化也是最后要处理的事情。
答案 1 :(得分:2)
它可能会提高性能,是的。它也可能完全破坏你的表现。或者它可能没有任何影响,因为编译器已经为您做了类似的事情。或者它可能没有任何影响,因为你只是不经常使用这些整数来实现这一点。
它还取决于一个或多个线程是否访问这些整数,以及它们是仅读取还是修改数字。 (如果你有多个线程,并且你写入这些整数,那么将它们放在一个数组中会导致错误的共享,这会比你希望得到的任何东西都损害你的表现)
那你为什么不试试呢?
没有简单的答案。您将获得的唯一严重的答案是“它取决于”。如果您想知道它在您的案例中的表现,那么您有两种选择:
如果你选择#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级缓存)。
所以是的,如果你要一起使用它们,即它们彼此相关,那么这可能会更有效率,这也证明你也考虑了如何分配它们。