我知道,一個常見的性能重構是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