我知道,一个常见的性能重构是System.arraycopy.
对多维数组高效System.arraycopy
我想请教一下,以取代简单for
的:
当究竟系统。 arraycopy开始有意义(考虑到它是一个本地方法调用)。复制小事说,< 32有什么优势?
是我的印象,或者是它不只是可以复制(有效)循环像这样与arraycopy:
for (int j = 0; j < 2; ++j) { vpr[m][s + j][i] = vr[j]; }
我知道,一个常见的性能重构是System.arraycopy.
对多维数组高效System.arraycopy
我想请教一下,以取代简单for
的:
当究竟系统。 arraycopy开始有意义(考虑到它是一个本地方法调用)。复制小事说,< 32有什么优势?
是我的印象,或者是它不只是可以复制(有效)循环像这样与arraycopy:
for (int j = 0; j < 2; ++j) {
vpr[m][s + j][i] = vr[j];
}
System.arrayCopy
可能是复制数组的最快方法,但它不会进行深层复制。
它也不能在你的第二个问题中做更复杂的例子。
据我所知,System.arrayCopy是最有效和最好的方法复制你的数组。我不知道任何情况下,实现自己的循环的替代方式对于直接副本来说会更有效率。
与所有性能时序问题一样,您确实需要在您期望运行代码的环境中进行基准测试。不同的JVM版本和硬件(CPU,内存等)配置可能会有不同的结果。这真的取决于您的具体性能要求。
但是,在达到这个性能优化级别之前,您应该先清楚地编写代码,并且先让它正确。编译器和JIT将能够使用正常的算法表达式进行很多优化,但有时手优化会混淆这些自动优化。在你有了一个工作产品,并且如果性能不是那么你想要的,那么只能在热点上进行配置和工作。 (虽然有时可能需要更复杂的代码来重构和/或更改逻辑。)
在这种情况下,如果您复制整个阵列,然后使用System.arraycopy
,因为这是执行此操作的标准方法。现在或将来编译器可能会为此提供额外的优化,因为核心API依赖于此,所以您可以放心,这是JVM开发人员始终希望以最佳方式运行的事情。
您将需要运行一些循环,因为System.arraycopy
只能执行单个数组对象,而使用Java多维数组确实是数组的数组。所以......
public int[][][] copyOf3Dim(int[][][] array) {
int[][][] copy;
copy = new int[array.length][][];
for (int i = 0; i < array.length; i++) {
copy[i] = new int[array[i].length][];
for (int j = 0; j < array[i].length; j++) {
copy[i][j] = new int[array[i][j].length];
System.arraycopy(array[i][j], 0, copy[i][j], 0,
array[i][j].length);
}
}
return copy;
}
或者你可以使用Arrays.copyOf
它采用System.arraycopy
和一些内部反射(这样是不是一样快,直接使用System.arraycopy
自己),但不这样做的深层副本。
使用System.arraycopy进行快速深度复制并不困难。下面是一个例子为一个二维数组:
for (int i = 0; i < src.length; i++) {
System.arraycopy(src[i], 0, dest[i], 0, src[0].length);
}
从快速定时试验,使用这种复制1000×1000二维数组100倍使用更明显两个for循环和分配需要40毫秒,相对于1740毫秒。
我的要求是跳过第一行,并用剩下的行创建一个新的数组。所以,我修改如下。 System.arraycopy(src [i],0,dest [i-1],0,src [0] .length-1);对于(int i = 1; i
如果你对性能感到绝对疯狂(除非你进行基准测试并发现瓶颈,否则你不应该这么做),那么你通常可以用一维数组替换一个多维数组。 – 2014-07-19 21:51:27