在做了一些阅读之后,我发现在 java 中复制数组的方式存在一些差异。对于我的应用程序,我有一个递归节点树,每个节点都包含一个二维板数组(8x8)。
通过 profiler 测试,我能想到的最好的方法是 java.util.Arrays.copyOf(array) 方法,它使用本机 System.arraycopy。
即便如此,我仍将 80% 的时间用于创建新阵列。如果有人对如何加快速度有任何想法,我将不胜感激。也许使用 64 项数组而不是 8x8 会更快。我很快就会对此进行测试。
在做了一些阅读之后,我发现在 java 中复制数组的方式存在一些差异。对于我的应用程序,我有一个递归节点树,每个节点都包含一个二维板数组(8x8)。
通过 profiler 测试,我能想到的最好的方法是 java.util.Arrays.copyOf(array) 方法,它使用本机 System.arraycopy。
即便如此,我仍将 80% 的时间用于创建新阵列。如果有人对如何加快速度有任何想法,我将不胜感激。也许使用 64 项数组而不是 8x8 会更快。我很快就会对此进行测试。
您花费 80% 的时间复制数组这一事实意味着以下两件事之一:
您的复印性能可能已经很先进了;请考虑您的应用程序的体系结构,尝试减少复制的数据量。
如果您的代码需要清晰, System.arraycopy() 是最好的。
但是,如果性能正在成为真正的瓶颈,您可以查看:
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 ?
我最近在这方面进行了调查(请参阅我对自己的问题的回答Is there any way to create an original array without initialization?,它可能被命名为“为什么 Array.copyOf 如此缓慢”或“为什么 Java太慢了”),甚至向 Oracle 发送了 RFE。主要思想是Java在无用的数组初始化上花费了太多时间。这是关于如何 Arrays.copyOf 可以更快。
感谢您的回复。一个 8x8 数组本质上是 9 次数组分配和 1 次初始化。使用大小为 64 的数组而不是 8x8,分配只有一次,我现在可以跳过初始化。
但是,我会考虑其他提高速度的方法......因为更快的数组副本意味着我可以制作更多节点:D。
感谢大家