6

在做了一些阅读之后,我发现在 java 中复制数组的方式存在一些差异。对于我的应用程序,我有一个递归节点树,每个节点都包含一个二维板数组(8x8)。

通过 profiler 测试,我能想到的最好的方法是 java.util.Arrays.copyOf(array) 方法,它使用本机 System.arraycopy。

即便如此,我仍将 80% 的时间用于创建新阵列。如果有人对如何加快速度有任何想法,我将不胜感激。也许使用 64 项数组而不是 8x8 会更快。我很快就会对此进行测试。

4

5 回答 5

3

您花费 80% 的时间复制数组这一事实意味着以下两件事之一:

  1. 数组复制太慢;
  2. 除了复制数组之外,您几乎没有做任何其他事情。

您的复印性能可能已经很先进了;请考虑您的应用程序的体系结构,尝试减少复制的数据量。

于 2012-12-16T14:15:39.457 回答
3

如果您的代码需要清晰, System.arraycopy() 是最好的。

但是,如果性能正在成为真正的瓶颈,您可以查看:

于 2012-12-16T14:15:59.083 回答
1

you need an algorithmic improvement. (are you doing a min max chess algorithm ?)

A possibility is to just copy the reference to each 8x8 array and add a 'shared' flag to each array. Then copy the array only if you actually do change the array. As long you are not changing all of the arrays, this would reduce copying a lot.

Another variant would be to find a more compact representation for your 8x8 array (e.g. some bit magic).

What do your array entries contain ?

于 2012-12-16T16:39:01.270 回答
1

我最近在这方面进行了调查(请参阅我对自己的问题的回答Is there any way to create an original array without initialization?,它可能被命名为“为什么 Array.copyOf 如此缓慢”或“为什么 Java太慢了”),甚至向 Oracle 发送了 RFE。主要思想是Java在无用的数组初始化上花费了太多时间。这是关于如何 Arrays.copyOf 可以更快。

于 2012-12-16T16:04:21.817 回答
0

感谢您的回复。一个 8x8 数组本质上是 9 次数组分配和 1 次初始化。使用大小为 64 的数组而不是 8x8,分配只有一次,我现在可以跳过初始化。

但是,我会考虑其他提高速度的方法......因为更快的数组副本意味着我可以制作更多节点:D。

感谢大家

于 2012-12-17T05:44:52.857 回答