Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用结构/类增加缓存空间局部性?_Java_C++_Performance_Caching - Fatal编程技术网

Java 使用结构/类增加缓存空间局部性?

Java 使用结构/类增加缓存空间局部性?,java,c++,performance,caching,Java,C++,Performance,Caching,如果取1000行计算机代码,而不是单独声明变量,将它们分组到类和结构中(显然这取决于所使用的变量大小),这会直接增加缓存空间局部性(从而降低缓存未命中率)吗 我的印象是将类/结构中的变量关联起来,它们将被分配连续内存地址?如果不做出一些非常不合理的假设,回答这个问题是不可能的。空间局部性既与算法有关,也与数据结构有关,因此根据您使用的算法将逻辑相关的数据元素分组在一起可能没有任何后果,甚至更糟 例如,考虑3D空间中100点的表示。您可以将它们放在三个单独的数组中,或者创建一个三元组结构/类,并将

如果取1000行计算机代码,而不是单独声明变量,将它们分组到类和结构中(显然这取决于所使用的变量大小),这会直接增加缓存空间局部性(从而降低缓存未命中率)吗


我的印象是将类/结构中的变量关联起来,它们将被分配连续内存地址?

如果不做出一些非常不合理的假设,回答这个问题是不可能的。空间局部性既与算法有关,也与数据结构有关,因此根据您使用的算法将逻辑相关的数据元素分组在一起可能没有任何后果,甚至更糟

例如,考虑3D空间中100点的表示。您可以将它们放在三个单独的数组中,或者创建一个三元组结构/类,并将它们组成一个数组

如果您的算法必须在每个步骤上同时获得每个点的所有三个坐标,则元组表示将获胜。但是,如果您想构建一个独立地在每个维度上运行的算法,并在三个独立线程之间并行化它,那么想想会发生什么。在这种情况下,三个单独的阵列将轻而易举地获胜,因为这样的布局将避免错误共享,并就一维一次算法而言改善空间局部性


这个例子表明没有“一刀切”的解决方案。应始终在特定算法的上下文中考虑空间局部性;在一种情况下,一个好的解决方案可能会在其他看似类似的情况下变得糟糕。

如果不做出一些非常不合理的假设,回答这个问题是不可能的。空间局部性既与算法有关,也与数据结构有关,因此根据您使用的算法将逻辑相关的数据元素分组在一起可能没有任何后果,甚至更糟

例如,考虑3D空间中100点的表示。您可以将它们放在三个单独的数组中,或者创建一个三元组结构/类,并将它们组成一个数组

如果您的算法必须在每个步骤上同时获得每个点的所有三个坐标,则元组表示将获胜。但是,如果您想构建一个独立地在每个维度上运行的算法,并在三个独立线程之间并行化它,那么想想会发生什么。在这种情况下,三个单独的阵列将轻而易举地获胜,因为这样的布局将避免错误共享,并就一维一次算法而言改善空间局部性


这个例子表明没有“一刀切”的解决方案。应始终在特定算法的上下文中考虑空间局部性;在一种情况下,一个好的解决方案可能在其他看似类似的情况下变为坏的解决方案。

如果您谈论的是方法局部变量,它们在堆栈上已经是连续的,或者严格地说是在激活记录中,这些记录几乎总是在堆栈上。如果你正在谈论java对象的引用,或者指向动态分配C++对象的指针,将它们放入包含类不会有任何不同的原因:相关的对象仍然在堆中任意位置。 如果您谈论的是方法局部变量,那么它们在堆栈上已经是连续的,或者严格地说,在激活记录中,它们几乎总是在堆栈上。如果你正在谈论java对象的引用,或者指向动态分配C++对象的指针,将它们放入包含类不会有任何不同的原因:相关的对象仍然在堆中任意位置。 如果您询问是否将局部变量分组到显式定义的结构中,则不会有优势。局部变量的实现方式通常与类结构的实现密切相关,对于同时具有这两者的任何语言

因此,局部变量应该已经具有良好的空间局部性,除非语言实现做了一些奇怪的事情来搞砸它


您可以通过将递归过程中不使用的大块局部状态隔离到单独的非递归函数中来改进局部性。这将是一个微观优化,因此您需要首先检查机器代码,以确保它不会浪费时间。无论如何,它与将局部变量移动到
类中无关。如果您询问是否将局部变量分组到显式定义的结构中,则不会有任何优势。局部变量的实现方式通常与类结构的实现密切相关,对于同时具有这两者的任何语言

因此,局部变量应该已经具有良好的空间局部性,除非语言实现做了一些奇怪的事情来搞砸它


您可以通过将递归过程中不使用的大块局部状态隔离到单独的非递归函数中来改进局部性。这将是一个微观优化,因此您需要首先检查机器代码,以确保它不会浪费时间。不管怎样,这与将本地人迁移到

中无关,你说的是哪种语言?因为java和C++是不同的语言,一般来说,是的,但是它取决于变量的访问模式。如果堆分配变量的总内存不适合缓存线,则可能仍然存在频繁的缓存未命中。如果没有关于具体问题的更多详细信息,很难说是否会降低未命中率。但是,通常是的,结构的内容将被分配连续的地址(至少对于C和C++)。@Shams,假设我们的数据(如果在结构/类中声明)可以放在一个缓存线中。即使Java类中有其成员