在Java中,复制double[]数组的最快方法是什么?

7

简单的问题,Java中复制双精度数组的最快方法是什么?我目前是这样做的...

public static double[] clone_doubles(double[] from)
{
    double[] to = new double[from.length];
    for (int i = 0; i < from.length; i++) to[i] = from[i];
    return to;
}

这段代码也会进行分配以避免溢出,但如果有更快的方法,我将把分配和复制分开。

我已经查看了Arrays.copyOf()System.arraycopy(),但我想知道是否有任何巧妙的技巧。

编辑: 如何复制一个double[][]


1
“将分配与复制分开”是什么意思?您是否意味着能够重复使用目标数组而不是分配新数组?我猜System.arraycopy()更快,比您的代码快得多。您进行了性能分析吗? - erickson
2
为什么不将 arr.clone() 添加到您的列表中,对所有四种方法进行基准测试,并在此处发布结果呢? :-) - NPE
@aix,当 JIT 时,clone() 和 Arrays.copy 是相同的。 - bestsss
5个回答

14

Java Practices对int数组的不同复制方法进行了比较:

这里是他们网站上的结果:

java -cp . -Xint ArrayCopier performance 250000

使用clone:93毫秒
使用System.arraycopy:110毫秒
使用Arrays.copyOf:187毫秒
使用for循环:422毫秒

看起来像是System.arraycopy()clone()之间的平局。


有趣的是,同一网站建议避免克隆... http://www.javapractices.com/topic/TopicAction.do?Id=71 - Simon
2
@Simon,该网站表示“避免实现克隆”,但并不是要避免使用克隆。 - Naveen Babu
1
为什么System.arraycopy()(110毫秒)和Arrays.copyOf()(187毫秒)之间有这么大的差异?Arrays.copyOf()不是在内部使用System.arraycopy()吗? - Vasu
1
他们的基准测试明显存在缺陷。我不会相信他们的结果(顺便说一下,我知道这些结果是不准确的)。 - assylias
@Kailash 当然,这些结果毫无意义。 - assylias
显示剩余2条评论

7

System.arraycopy 可能是你最好的选择,如果你只想从一个数组复制到另一个数组。

否则,

public static double[] clone_doubles(double[] from) {
  return (double[]) from.clone();
}

这将为您提供一个克隆。


1

1

System.arraycopy() 是您最好的选择。通常,它是使用本地指令实现的,可能涉及直接调用操作系统的内存管理器。

在 Java 6 中,当没有重叠发生时,arraycopy 的性能得到了 改善,因为“手工编码的汇编存根现在用于每种类型大小”。

阅读此其他帖子以获取更多详细信息。


0
public static double[] clone_doubles(double[] from)
{
    return Arrays.copyOf(from, from.length);
}

这是使用System.arrayCopy()内部实现的:

public static double[] copyOf(double[] original, int newLength) {
    double[] copy = new double[newLength];
    System.arraycopy(original, 0, copy, 0,
                     Math.min(original.length, newLength));
    return copy;
}

这实际上是无关紧要的,它使用固有函数,代码不会像那样由JIT执行。 - bestsss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接