2010-01-14 50 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