在做了一些阅读之后,我发现在java中复制数组的方式存在一些差异。对于我的应用程序,我有一个递归的节点树,每个节点包含一个2d板阵列(8x8)。
通过分析器测试,我能想到的最好的东西是java.util.Arrays.copyOf(array)方法,该方法使用本机System.arraycopy。
即便如此,我仍有80%的时间用于创建新阵列。如果有人对如何加快这一点有任何想法我会很感激。也许转到64项阵列而不是8x8会更快。我很快就会测试一下。
答案 0 :(得分:3)
您花费80%的时间复制数组这一事实意味着以下两点之一:
您的复制性能可能已经很先进;请考虑应用程序的体系结构,尝试减少复制数据的数量。
答案 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。谢谢大家