Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对于最多包含10个元素的数组:用于循环复制还是System.arrayCopy?_Java_Arrays_Copy - Fatal编程技术网

Java 对于最多包含10个元素的数组:用于循环复制还是System.arrayCopy?

Java 对于最多包含10个元素的数组:用于循环复制还是System.arrayCopy?,java,arrays,copy,Java,Arrays,Copy,假设Java中的对象[]为10个元素或更少,那么复制数组的最快方法是什么 缓存长度是没有用的。您正在直接访问一个字段。即使它是一种方法,JIT也会内联并优化它 如果必须对某些内容进行优化,System.arraycopy将包含优化 但真正的答案是,这一点都不重要。如果选择复制10个或更少元素的数组的最合适方式,则不会获得显著的性能提升。如果您有性能问题,那么通过测量来搜索问题的来源,然后优化必须优化的内容。对于其余部分,使用可读性和可维护性最好的方法。你所做的是过早的优化。这是所有邪恶的根源(

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


  • 缓存长度是没有用的。您正在直接访问一个字段。即使它是一种方法,JIT也会内联并优化它

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

    但真正的答案是,这一点都不重要。如果选择复制10个或更少元素的数组的最合适方式,则不会获得显著的性能提升。如果您有性能问题,那么通过测量来搜索问题的来源,然后优化必须优化的内容。对于其余部分,使用可读性和可维护性最好的方法。你所做的是过早的优化。这是所有邪恶的根源(D.克努斯说)

  • 这三种选择之间的差异可能相对较小

  • 很可能这与应用程序的总体性能无关

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

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


  • 你最好忘记这一点,用你觉得最自然的方式编码。如果发现已完成的应用程序运行太慢,请对其进行评测,并根据评测结果进行调优。在这一点上,有必要尝试这三种替代方案,看看哪一种更适合您的应用程序的特定用例。(另一种方法可能是首先看看避免阵列复制是否明智。)

    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);