如果我有一个 C 或 C++ 程序,我在整个程序中使用 20 个整数,那么创建一个大小为 20 的数组来存储整数然后为每个数字创建别名会提高性能吗?
这会改善缓存局部性(而不仅仅是创建 20 个普通整数),因为整数将作为整数数组的一部分一起加载到缓存中(或者至少,提高这种可能性)?
如果我有一个 C 或 C++ 程序,我在整个程序中使用 20 个整数,那么创建一个大小为 20 的数组来存储整数然后为每个数字创建别名会提高性能吗?
这会改善缓存局部性(而不仅仅是创建 20 个普通整数),因为整数将作为整数数组的一部分一起加载到缓存中(或者至少,提高这种可能性)?
问题是如何为它们分配空间?我怀疑你只是new int
在代码中随意地做 20 次。如果它们是局部变量,那么它们将进入堆栈并被缓存。
主要问题是这值得打扰吗?首先尝试以可读和优雅的方式编写程序,然后尝试消除主要瓶颈,并且只有在开始弄乱微优化之后。如果您正在处理 20 个整数,它们本质上不应该是数组吗?
还是理论问题?如果是,那么是的,数组可能会比内存中的 20 个随机区域缓存得更好。如果这是一个实际问题,那么我怀疑这是否真的很重要,除非您正在编写超临界性能代码,即使这样,微优化也是最后要处理的事情。
它可能会提高性能一点,是的。它也可能完全毁掉你的表现。或者它可能没有任何影响,因为编译器已经为你做了类似的事情。或者它可能没有影响,因为您只是没有经常使用这些整数来产生影响。
它还取决于一个或多个线程是否访问这些整数,以及它们是否只是读取或修改数字。(如果您有多个线程并且您写入这些整数,那么将它们放在一个数组中会导致错误共享,这将比您希望获得的任何东西都更严重地损害您的性能)
那你为什么不试试呢?
没有简单、单一的答案。你会得到的唯一严肃的答案是“这取决于”。如果您想知道它在您的情况下的表现,那么您有两种选择:
如果您选择#2,您可能需要继续使用#1,以验证您的猜测是否正确。
性能并不简单。几乎没有通用规则,一切都取决于上下文。在一种情况下作为优化的更改可能会在另一种情况下减慢一切。
如果您认真考虑优化您的代码,那么上面的两个步骤是无可替代的。如果您对此不认真,请不要这样做。:)
是的,理论上 20 个整数出现在同一缓存行上的可能性会更高,尽管我认为一个好的编译器几乎总是能够为您复制相同的性能,即使不使用数组也是如此。
那么,您目前在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]
。这取决于编译器对“我们正在接触相同的数据”的检测有多细。而且我怀疑它可能经常基于“对象”而不是对象的单个字段 - 特别是对于数组。
但是,如果您确实有紧密使用的数据,例如位置变量,则将它们彼此相邻可能会有所帮助。
但我认真地认为你是在浪费时间试图将变量放在一起,并且使用数组几乎可以肯定是一个坏主意。
它可能会降低性能。当您不查看时,现代编译器会在内存中移动变量,并且可能在不同时使用时将两个变量存储在同一地址。根据您的数组想法,这些变量不能重叠,并且必须使用不同的缓存行。
是的,这可能会提高你的性能,但它可能不会,因为它真正的变量应该一起使用,应该存储在一起。
因此,如果它们一起使用,那么可以。变量和对象确实应该在使用它们的函数中声明,因为它们将存储在堆栈中(大多数情况下为一级缓存)。
所以是的,如果你打算一起使用它们,即它们彼此相关,那么这可能会更有效率,前提是你还考虑了如何分配它们的内存。