需要更快的阵列副本

时间:2012-12-16 14:07:36

标签: java arrays performance copy

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

通过分析器测试,我能想到的最好的东西是java.util.Arrays.copyOf(array)方法,该方法使用本机System.arraycopy。

即便如此,我仍有80%的时间用于创建新阵列。如果有人对如何加快这一点有任何想法我会很感激。也许转到64项阵列而不是8x8会更快。我很快就会测试一下。

5 个答案:

答案 0 :(得分:3)

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

  1. 阵列复制速度太慢;
  2. 除了复制数组之外,你几乎没有做任何事情。
  3. 您的复制性能可能已经很先进;请考虑应用程序的体系结构,尝试减少复制数据的数量。

答案 1 :(得分:3)

如果您的代码需要清楚,

System.arraycopy()是最好的。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

你需要一个算法改进。 (你在做最小的最大国际象棋算法吗?)

一种可能性是只复制对每个8x8数组的引用,并为每个数组添加一个“共享”标志。然后,只有在实际更改阵列时才复制数组。只要你不改变所有数组,这将减少很多复制。

另一种变体是为你的8x8数组找到一个更紧凑的表示形式(例如一些魔术)。

您的数组条目包含哪些内容?

答案 4 :(得分:0)

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

但是,我会考虑提高速度的其他方法...因为更快的阵列复制意味着我可以创建更多节点:D。

谢谢大家