Java 对于最多包含10个元素的数组:用于循环复制还是System.arrayCopy?
假设Java中的对象[]为10个元素或更少,那么复制数组的最快方法是什么Java 对于最多包含10个元素的数组:用于循环复制还是System.arrayCopy?,java,arrays,copy,Java,Arrays,Copy,假设Java中的对象[]为10个元素或更少,那么复制数组的最快方法是什么 缓存长度是没有用的。您正在直接访问一个字段。即使它是一种方法,JIT也会内联并优化它 如果必须对某些内容进行优化,System.arraycopy将包含优化 但真正的答案是,这一点都不重要。如果选择复制10个或更少元素的数组的最合适方式,则不会获得显著的性能提升。如果您有性能问题,那么通过测量来搜索问题的来源,然后优化必须优化的内容。对于其余部分,使用可读性和可维护性最好的方法。你所做的是过早的优化。这是所有邪恶的根源(
缓存长度是没有用的。您正在直接访问一个字段。即使它是一种方法,JIT也会内联并优化它 如果必须对某些内容进行优化,
System.arraycopy
将包含优化
但真正的答案是,这一点都不重要。如果选择复制10个或更少元素的数组的最合适方式,则不会获得显著的性能提升。如果您有性能问题,那么通过测量来搜索问题的来源,然后优化必须优化的内容。对于其余部分,使用可读性和可维护性最好的方法。你所做的是过早的优化。这是所有邪恶的根源(D.克努斯说)
你最好忘记这一点,用你觉得最自然的方式编码。如果发现已完成的应用程序运行太慢,请对其进行评测,并根据评测结果进行调优。在这一点上,有必要尝试这三种替代方案,看看哪一种更适合您的应用程序的特定用例。(另一种方法可能是首先看看避免阵列复制是否明智。)System.arraycopy()是复制阵列的最快方法,因为它的设计和优化正是为了完成此任务。有传言称,对于小型阵列,它的编码循环可能更快——但目前情况并非如此。System.arraycopy是一个JIT内部函数,JIT为每种情况选择最佳实现 一定要给自己买一本关于JVM内部结构的书(例如,“Oracle JRockit,权威指南”),并意识到JVM在预热、循环展开、方法内联、寄存器重新分配、循环不变提取等之后执行的操作将与您在Java源代码中编写的操作不太相似
抱歉:-)否则,您会喜欢阅读。为什么不对此进行基准测试并报告?;-)对于这么小的阵列,我认为差异太小,以至于无法注意到。你为什么会在乎哪个更快?你能提供更多的上下文来解释你为什么需要这个吗?2>1,也可以使用++i而不是i++@savinos:然后你必须实现你自己的系统类。标准版有arraycopy,但没有arraycopy。
for(int i = 0;i < a.length;i++)
for(int i = 0,l = a.length;i < l;i++) // i.e. is caching array len in local var faster?
System.arrayCopy(a, 0, a2, 0, a.length);