2010-01-14 31 views
7

我知道,一個常見的性能重構是System.arraycopy.對多維數組高效System.arraycopy

我想請教一下,以取代簡單for的:

  1. 當究竟系統。 arraycopy開始有意義(考慮到它是一個本地方法調用)。複製小事說,< 32有什麼優勢?

  2. 是我的印象,或者是它不只是可以複製(有效)循環像這樣與arraycopy:

    for (int j = 0; j < 2; ++j) { 
         vpr[m][s + j][i] = vr[j]; 
        } 
    
+0

如果你對性能感到絕對瘋狂(除非你進行基準測試並發現瓶頸,否則你不應該這麼做),那麼你通常可以用一維數組替換一個多維數組。 – 2014-07-19 21:51:27

回答

3

System.arrayCopy可能是複製數組的最快方法,但它不會進行深層複製。

它也不能在你的第二個問題中做更復雜的例子。

1

據我所知,System.arrayCopy是最有效和最好的方法複製你的數組。我不知道任何情況下,實現自己的循環的替代方式對於直接副本來說會更有效率。

7

與所有性能時序問題一樣,您確實需要在您期望運行代碼的環境中進行基準測試。不同的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自己),但不這樣做的深層副本。

21

使用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毫秒。

+0

我的要求是跳過第一行,並用剩下的行創建一個新的數組。所以,我修改如下。 System.arraycopy(src [i],0,dest [i-1],0,src [0] .length-1);對於(int i = 1; i hemanto 2017-12-13 05:48:18