如何有效地迭代固定的三维矩阵(java)
作为我正在构建的程序的一部分,我需要迭代三维矩阵中的所有点。 在每一点上,我都需要执行一个以intx,inty,intz为参数的方法 三维矩阵始终具有相同的宽度(16)、长度(16)和高度(256) 进行迭代最有效的方法是什么?(我特别关注CPU,而不是ram的使用) 据我所知,我认为这是最有效的方法,但如果其他建议更快,我愿意接受 A.直接迭代:如何有效地迭代固定的三维矩阵(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而言,计数循环已经是最有效的
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的一部分,我无法控制,并且没有其他替代方法,因此我只能优化循环,而不是方法本身。不过,我会在示例中添加更多信息。内存中矩阵的布局可以因为缓存的使用而有所不同。我认为最好的办法是遍历矩阵,确保访问连续的数据。我知道这两个函数在功能上是等效的,但我不确定在这种情况下,它们编译为完全相同的代码,感谢您清除了这一点,并感谢您提出的替代方案。