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

What is the fastest way to copy a double[] in Java? [duplicate]

提问人:Simon 提问时间:10/13/2011 最后编辑:Simon 更新时间:4/22/2017 访问量:6408

问:

简单的问题,在 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赞 erickson 10/13/2011
“将分配与副本分开”是什么意思?您的意思是您可以重用目标数组而不是分配新的数组吗?我猜这是最快的,比你的代码快得多。你剖析过吗?System.arraycopy()
2赞 NPE 10/13/2011
为什么不添加到您的列表中,对所有四种方法进行基准测试,并在此处发布结果呢?:-)arr.clone()
0赞 bestsss 12/15/2011
@aix,clone() 与 JIT 时的 Arrays.copy 相同

答:

7赞 Mike Samuel 10/13/2011 #1

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

否则

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

会给你一个克隆。

0赞 Sean Patrick Floyd 10/13/2011 #2
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;
}

评论

0赞 bestsss 12/15/2011
这实际上是无关紧要的,它使用内部函数,代码不是由JIT那样执行的
1赞 Óscar López 10/13/2011 #3

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

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

阅读这篇其他文章了解更多详情。

14赞 dtyler 10/13/2011 #4

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

以下是他们网站的结果:

java -cp 的 。-Xint Array复印机性能250000

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

在我看来,就像是 和 之间的纽带。System.arraycopy()clone()

评论

0赞 Simon 10/13/2011
有趣的是,同一个网站说避免克隆......javapractices.com/topic/TopicAction.do?Id=71
0赞 monksy 10/13/2011
这是我喜欢看到的答案!:)
2赞 Naveen Babu 10/13/2011
@Simon网站说“避免实施克隆”,但不是避免克隆
1赞 Vasu 12/4/2011
为什么 System.arraycopy() (110 ms) 和 Arrays.copyOf() (187 ms) 之间有这么大的区别?Arrays.copyOf() 不是在内部使用 System.arraycopy() 吗?
1赞 assylias 5/30/2013
他们的基准存在重大缺陷。我不会相信他们的结果(顺便说一句,我知道这是不准确的)。
1赞 bestsss 12/15/2011 #5

Arrays.copy、[].clone 和 System.arraycopy w/ new 对象在正确的 JIT 时使用相同的代码路径。

这是相应的错误:https://bugs.java.com/bugdatabase/view_bug?bug_id=6428387