C++ 缓存局部性性能

C++ 缓存局部性性能,c++,c,performance,optimization,C++,C,Performance,Optimization,这是否会改善缓存的局部性(而不仅仅是创建20个普通整数),因为整数将作为整数数组的一部分一起加载到缓存中(或者至少提高了这种可能性)?问题是如何为它们分配空间?我怀疑你只是在代码中随意地做newint20次。若它们是局部变量,那个么它们将进入堆栈并被缓存 主要的问题是,这值得麻烦吗?首先尝试以可读且优雅的方式编写您的程序,然后尝试移除主要瓶颈,并且只有在开始处理微优化之后。如果您正在处理20个整数,那么它们本质上不应该是数组吗 这也是一个理论问题吗?若是,那个么是的,数组的缓存可能比内存中的20


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

问题是如何为它们分配空间?我怀疑你只是在代码中随意地做
newint
20次。若它们是局部变量,那个么它们将进入堆栈并被缓存

主要的问题是,这值得麻烦吗?首先尝试以可读且优雅的方式编写您的程序,然后尝试移除主要瓶颈,并且只有在开始处理微优化之后。如果您正在处理20个整数,那么它们本质上不应该是数组吗


这也是一个理论问题吗?若是,那个么是的,数组的缓存可能比内存中的20个随机区域要好。如果这是一个实际的问题,那么我怀疑这是否真的很重要,除非您正在编写超临界性能代码,甚至微优化是最后一件要处理的事情。

是的,理论上20个整数在同一缓存线上结束的几率会更高,尽管我认为一个好的编译器几乎总是能够为您复制相同的性能,即使不使用数组。

因此,您目前有
int positionX,positionY,positionZ然后在其他地方
int fuzzy
intfoo,等等来生成大约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\u position
,它涉及
arr[0]…arr[2]
。这取决于编译器检测“我们正在接触相同数据”的细粒度。我怀疑它可能经常基于“对象”,而不是对象的单个字段,特别是对于数组

但是,如果您确实有紧密使用的数据,例如位置变量,则将它们彼此相邻可能会有所帮助


但我认真地认为,试图将变量彼此相邻是在浪费时间,而使用数组几乎肯定是个坏主意

它可能会稍微提高性能,是的。这也可能会彻底毁掉你的表现。或者它可能没有任何影响,因为编译器已经为您做了类似的事情。或者它可能没有任何影响,因为您只是没有经常使用这些整数,因此不会产生影响

它还取决于是一个线程还是多个线程访问这些整数,以及它们是只是读取还是修改数字。(如果您有多个线程并写入这些整数,那么将它们放入数组将导致错误共享,这将对您的性能造成比您希望获得的任何结果都要大的伤害)

那你为什么不试试呢

没有简单、单一的答案。你将得到的唯一严肃的回答是“视情况而定”。如果您想知道它在您的情况下的行为,那么您有两个选择:

  • 试试看会发生什么,或者
  • 全面了解CPU的工作方式,收集关于这些值的访问频率和模式的数据,以便对更改将如何影响性能进行有根据的猜测
  • 如果你选择了#2,你可能需要在后面加上#1,以验证你的猜测是否正确

    性能并不简单。几乎没有通用的规则,一切都取决于上下文。在一种情况下是优化的更改在另一种情况下可能会减慢速度


    如果您真的想优化代码,那么上面的两个步骤是无可替代的。如果你不是认真的,就不要这样做

    这可能会降低性能。现代编译器在不查看时会在内存中移动变量,在不同时使用时可能会将两个变量存储在同一地址。根据您的数组思想,这些变量不能重叠,必须使用不同的缓存线

    是的,这可能会提高您的性能,但可能不会,因为它真正的变量是一起使用的,应该一起存储

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


    是的,如果您要将它们一起使用,即它们彼此相关,那么这可能会更有效率,这证明您还需要考虑如何分配它们的内存。

    您如何知道您的编译器还没有这样做?它们是常量吗?很可能这不是你应该担心的事情。@BoPersson,因为是CPU在执行过程中缓存东西。你会一起使用它们吗?否则,改善他们的位置将毫无帮助。还要注意,缓存有超过20条缓存线,所以这取决于应用程序是否使用更多的数据。如果不了解任何有关该计划的信息,就无法给出一般性的答案this@Andrey:但是编译器(以及语言规范和源代码)决定了数据的布局。我认为这个问题的问题在于它是以超抽象的形式提出的,很难说具体的东西,只做假设。我指的是新的int[]-即int数组