Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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_Performance_Loops_3d_Iteration - Fatal编程技术网

如何有效地迭代固定的三维矩阵(java)

如何有效地迭代固定的三维矩阵(java),java,performance,loops,3d,iteration,Java,Performance,Loops,3d,Iteration,作为我正在构建的程序的一部分,我需要迭代三维矩阵中的所有点。 在每一点上,我都需要执行一个以intx,inty,intz为参数的方法 三维矩阵始终具有相同的宽度(16)、长度(16)和高度(256) 进行迭代最有效的方法是什么?(我特别关注CPU,而不是ram的使用) 据我所知,我认为这是最有效的方法,但如果其他建议更快,我愿意接受 A.直接迭代: public void doSomethingForAllPointsInMatrix(矩阵){ 对于(intx=0;x而言,计数循环已经是最有效的

作为我正在构建的程序的一部分,我需要迭代三维矩阵中的所有点。 在每一点上,我都需要执行一个以intx,inty,intz为参数的方法

三维矩阵始终具有相同的宽度(16)、长度(16)和高度(256)

进行迭代最有效的方法是什么?(我特别关注CPU,而不是ram的使用)

据我所知,我认为这是最有效的方法,但如果其他建议更快,我愿意接受

A.直接迭代:

public void doSomethingForAllPointsInMatrix(矩阵){

对于(intx=0;x而言,计数循环已经是最有效的迭代机制之一

合并数组的想法表明,您不知道数组上的for each循环只是索引从零到数组长度的计数循环的语法糖。
换句话说,你的

public void doSomethingForAllPointsInMatrix(矩阵){
for(int x:zerotofteen){
for(int z:zerotofteen){
对于(整数y:ZeroTotwoundiftyfive){
matrix.doSomething(x,y,z);//我无法控制的方法,没有任何选择
}
}
}
}
基本相当于

public void doSomethingForAllPointsInMatrix(矩阵){
for(int index1=0;index1
与第一种方法中的计数循环不同,只需执行额外的数组操作,这不太可能提高性能

因为你的边界是二的幂,你可以用一个循环完成整个操作

public void doSomethingForAllPointsInMatrix(矩阵){
对于(int-coord=0;coord<0x10000;coord++){
矩阵.剂量测定法(坐标>>12,坐标和0xff,(坐标>>8)和0xf);
}
}
减少条件的数量。但是,实际性能取决于JVM的优化器如何利用它,可能是它能更好地处理嵌套循环

因此,您只能尝试对这些方法进行基准测试,以找到“最佳”,而“最佳”可能会有所不同,具体取决于系统和JVM实现/版本


正如评论中所说,性能很可能由
doSomething
所做的任何事情决定,如果处理顺序对程序逻辑不重要,您应该尝试使用替代迭代顺序,因为它可能会影响缓存的使用方式。

您可以尝试此方法,并在类似问题上发布:谢谢链接,我已经完成了经检查,该线程的优化针对的是我问题中没有提到的问题。在这两种情况下,您的方法都会被调用
x*y*z
次。如果不知道您的方法的具体功能和返回结果,则很难提出一种通用的优化方法。也许您只是考虑性能太早了/unece同样地。实现功能,用一个维度很少的立方体测试它,当你面对性能问题时再问你的问题。你可能想看的东西:看看是否有对称性,不使用相同的参数多次调用你的方法,看看
doSomething(xi,yi,zi)之间是否有任何模式
剂量测定法(xn、yn、zn)
。虽然我同意一般的优化方法会更好,但该方法是另一个程序API的一部分,我无法控制,并且没有其他替代方法,因此我只能优化循环,而不是方法本身。不过,我会在示例中添加更多信息。内存中矩阵的布局可以因为缓存的使用而有所不同。我认为最好的办法是遍历矩阵,确保访问连续的数据。我知道这两个函数在功能上是等效的,但我不确定在这种情况下,它们编译为完全相同的代码,感谢您清除了这一点,并感谢您提出的替代方案。