【问题标题】:What is the fastest way to copy a double[] in Java? [duplicate]在 Java 中复制 double[] 的最快方法是什么? [复制]
【发布时间】:2011-10-12 16:54:06
【问题描述】:

简单的问题,在 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[][]怎么样?

【问题讨论】:

  • “将分配与副本分开”是什么意思?您的意思是您可以重复使用目标数组而不是分配一个新数组吗?我猜System.arraycopy() 是最快的,比你的代码快得多。你分析过它吗?
  • 为什么不将arr.clone() 添加到您的列表中,对所有四种方法进行基准测试,然后在此处发布结果? :-)
  • @aix,clone() 与 JIT 时的 Arrays.copy 相同

标签: java


【解决方案1】:

Java Practices did a comparison of different copy methods on arrays of int:

以下是他们网站的结果:

java -cp 。 -Xint ArrayCopier 性能 250000

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

在我看来就像System.arraycopy()clone() 之间的关系。

【讨论】:

  • 有趣,同一个网站说避免克隆...javapractices.com/topic/TopicAction.do?Id=71
  • 这是我喜欢看到的答案! :)
  • @Simon 该网站说“避免实施克隆”但不是避免克隆
  • 为什么 System.arraycopy() (110 ms) 和 Arrays.copyOf() (187 ms) 之间有如此大的差异? Arrays.copyOf() 内部不是使用 System.arraycopy() 吗?
  • 他们的基准测试存在明显缺陷。我不会相信他们的结果(顺便说一句,我知道这是不准确的)。
【解决方案2】:

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

否则

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

会给你一个克隆。

【讨论】:

    【解决方案3】:

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

    在 Java 6 中,arraycopy 的性能是 improved,因为“当不发生重叠时,手动编码的程序集存根现在用于每种类型大小”。

    阅读其他post了解更多详情。

    【讨论】:

      【解决方案4】:

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

      这里是对应的bug:http://bugs.sun.com/view_bug.do?bug_id=6428387

      【讨论】:

      • +1 一个合理的答案!
      【解决方案5】:
      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执行的
      猜你喜欢
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 2010-09-16
      • 1970-01-01
      • 2012-11-18
      • 2016-08-29
      相关资源
      最近更新 更多