【问题标题】:For arrays of up to 10 elements: for loop copy or System.arrayCopy?对于最多 10 个元素的数组:for 循环复制还是 System.arrayCopy?
【发布时间】:2012-01-24 10:27:53
【问题描述】:

假设 Java 中有 10 个元素或更少的 Object[],那么复制数组的最快方法是什么?

  1. for(int i = 0;i < a.length;i++)
    
  2. for(int i = 0,l = a.length;i < l;i++) // i.e. is caching array len in local var faster?
    
  3. System.arrayCopy(a, 0, a2, 0, a.length);
    

【问题讨论】:

  • 为什么不对此进行基准测试并报告回来? ;-)
  • 对于这么小的数组,我想差异会太小而无法注意到。你为什么要关心哪个更快?你能提供更多关于你为什么需要这个的背景信息吗?
  • 2 > 1, 也做 ++i 而不是 i++ stackoverflow.com/questions/1941391/…

标签: java arrays copy


【解决方案1】:
  1. 这三种选择之间的差异可能相对较小。

  2. 这可能与您的应用程序的整体性能无关。

  3. 相对差异可能取决于硬件平台和您使用的 Java 实现。

  4. 相对差异也会因数组的声明类型和实际类型而异。

您最好忘记这一点,而只是按照您认为最自然的方式进行编码。如果您发现已完成的应用程序运行速度太慢,请对其进行分析并根据分析结果进行调整。在这一点上,可能值得尝试这三种替代方案,看看哪个对于您的应用程序的特定用例来说更快。 (另一种方法可能是看看首先避免数组复制是否明智。)

【讨论】:

    【解决方案2】:

    缓存长度没有用。您正在直接访问一个字段。甚至它是一种方法,JIT 会内联和优化它。

    如果必须优化某些内容,System.arraycopy 将包含优化。

    但真正的答案是,这根本不重要。通过选择最合适的方式来复制包含 10 个或更少元素的数组,您不会获得显着的性能提升。如果你有性能问题,然后通过测量搜索它来自哪里,然后优化必须优化的内容。其余的,使用最易读和可维护的。你正在做的是过早的优化。它是万恶之源(D. Knuth 说)。

    【讨论】:

      【解决方案3】:

      System.arraycopy() 是复制数组的最快方法——因为它专门针对这项工作进行了设计和优化。有传言说,对于小型阵列,它的编码循环可能更快——但目前还不是这样。 System.arraycopy 是 JIT 内在函数,JIT 为每种情况选择最佳实现。

      【讨论】:

      【解决方案4】:

      一定要给自己买一本关于 JVM 内部原理的书(例如,“Oracle JRockit,权威指南”),并了解 JVM 在预热后执行的操作、循环展开、方法内联、寄存器重新分配、循环不变量提取等等将甚至不接近类似于您在 Java 源代码中编写的内容。

      对不起 :-) 否则,您会喜欢阅读 http://www.javaspecialists.eu

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-07
        • 1970-01-01
        • 1970-01-01
        • 2018-06-26
        • 1970-01-01
        • 2019-10-02
        相关资源
        最近更新 更多