如何有效地遍历固定的三维矩阵 (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
所做的一切,如果处理顺序对您的程序逻辑不重要,您应该尝试使用其他迭代顺序,因为它可能会影响缓存已被利用。
作为我正在构建的程序的一部分,我需要遍历三维矩阵中的所有点。 在每个点上我都需要执行一个以 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
所做的一切,如果处理顺序对您的程序逻辑不重要,您应该尝试使用其他迭代顺序,因为它可能会影响缓存已被利用。