如何有效地遍历固定的三维矩阵 (java)

How to iterate through a fixed tridimensional matrix efficiently (java)

作为我正在构建的程序的一部分,我需要遍历三维矩阵中的所有点。 在每个点上我都需要执行一个以 int x, int y, int z 作为参数的方法。

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

执行迭代的最高性能方法是什么?(我特别关心 CPU,不太关心 ram 使用)

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

一个。直接迭代:

public void doSomethingForAllPointsInMatrix(Matrix matrix){
  for(int x= 0; x<16; x++){
    for(int z = 0; z<16; z++){
      for(int y = 0; y<256; y++){
        matrix.doSomething(x,y,z);//A method out of my control without any alternatives
      }
    }
  }
}

乙。迭代一个包含坐标

的数组
private static final int[] zeroToFifteen; //Contains every number from 0 to 15
private static final int[] zeroToTwoHundredFiftyFive; //Contains every number from 0 to 255
public void doSomethingForAllPointsInMatrix(Matrix matrix){
  for(int x: zeroToFifteen){
    for(int z: zeroToFifteen){
      for(int y: zeroToTwoHundredFiftyFive){
        matrix.doSomething(x,y,z);//A method out of my control without any alternatives
      }
    }
  }
}

在此先感谢您提供的任何帮助!

计数循环已经是最有效的迭代机制之一。

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

public void doSomethingForAllPointsInMatrix(Matrix matrix){
  for(int x: zeroToFifteen){
    for(int z: zeroToFifteen){
      for(int y: zeroToTwoHundredFiftyFive){
        matrix.doSomething(x,y,z);//A method out of my control without any alternatives
      }
    }
  }
}

基本等同于

  public void doSomethingForAllPointsInMatrix(Matrix matrix){
    for(int index1 = 0; index1 < zeroToFifteen.length; index1++){
      int x = zeroToFifteen[index1];
      for(int index2 = 0; index2 < zeroToFifteen.length; index2++){
        int z = zeroToFifteen[index2];
        for(int index3 = 0; index3 < zeroToTwoHundredFiftyFive.length; index3++){
          int y = zeroToTwoHundredFiftyFive[index3];
          matrix.doSomething(x,y,z);//A method out of my control without any alternatives
        }
      }
    }
  }

与第一种方法的计数循环不同,只是进行了额外的数组操作,这不太可能提高性能。

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

public void doSomethingForAllPointsInMatrix(Matrix matrix) {
  for(int coord = 0; coord < 0x10000; coord++) {
    matrix.doSomething(coord >> 12, coord & 0xff, (coord >> 8)&0xf);
  }
}

减少条件句的数量。然而,实际性能取决于 JVM 的优化器从中得到什么,它可能可以更好地处理嵌套循环。

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

如评论中所述,性能可能取决于 doSomething 所做的一切,如果处理顺序对您的程序逻辑不重要,您应该尝试使用其他迭代顺序,因为它可能会影响缓存已被利用。