Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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阵列/ArrayList/LinkedList性能_Java_Performance - Fatal编程技术网

Java阵列/ArrayList/LinkedList性能

Java阵列/ArrayList/LinkedList性能,java,performance,Java,Performance,我使用以下代码测试了Array/ArrayList/LinkedList之间的性能 import java.util.ArrayList; import java.util.LinkedList; public class Main3 { public static void main(String[] args) throws Exception{ int n = 20000000; long bt = 0, et = 0; int

我使用以下代码测试了Array/ArrayList/LinkedList之间的性能

import java.util.ArrayList;
import java.util.LinkedList;

public class Main3 {
    public static void main(String[] args) throws Exception{

        int n = 20000000;
        long bt = 0, et = 0;

        int[] a0 = new int[n];
        ArrayList<Integer> a1 = new ArrayList<>(n);
        LinkedList<Integer> a2 = new LinkedList<>();
        Integer[] a3 = new Integer[n];

        bt = System.currentTimeMillis();
        for(int i=0; i<n; i++){
            a0[i] = i;
        }
        et = System.currentTimeMillis();
        System.out.println("===== loop0 time =======" + (et - bt));

        bt = System.currentTimeMillis();
        for(int i=0; i<n; i++){
            a1.add(i);
        }
        et = System.currentTimeMillis();
        System.out.println("===== loop1 time =======" + (et - bt));

        bt = System.currentTimeMillis();
        for(int i=0; i<n; i++){
            a2.add(i);
        }
        et = System.currentTimeMillis();
        System.out.println("===== loop2 time =======" + (et - bt));


        bt = System.currentTimeMillis();
        for(int i=0; i<n; i++){
            a3[i] = i;
        }
        et = System.currentTimeMillis();
        System.out.println("===== loop3 time =======" + (et - bt));
    }
}
为什么ArralyList/LinkedList比array慢? 我怎样才能提高性能

环境: Java:jdk1.8.0çu


谢谢

您的基准中存在潜在的不准确之处,但结果的总体排名可能是正确的。如果您在计时之前对代码进行“预热”,以允许JIT编译器生成本机代码并对其进行优化,那么所有基准测试的结果可能会更快。一些基准结果可能更接近甚至相等

迭代
int
数组要比迭代
整型
对象的
列表
快得多。
LinkedList
将是最慢的。这些陈述假设乐观主义者不会做出根本性的改变

让我们看看原因:

int
数组(
int[]
)是包含端到端排列的4字节int的连续内存区域。循环遍历并设置元素只需依次通过内存块设置4个字节。原则上需要进行索引检查,但实际上,优化人员可以意识到这不是必要的,并将其删除。JIT编译器能够基于本机CPU指令优化这类事情

Integer
对象的
ArrayList
包含指向单个
Integer
对象(或为空)的引用数组。每个
Integer
对象都必须单独分配(尽管Java可以重用小整数)。分配新对象会有开销,此外,引用可能是8字节而不是4字节。此外,如果未指定列表大小(尽管在您的情况下是这样),则可能需要重新分配内部数组。调用
add
方法而不是直接分配给数组会产生开销(不过优化器可能会删除此项)

您的
Integer
基准数组与数组列表类似,但没有list add方法调用(必须跟踪列表大小)的开销。不过,您的基准可能夸大了此数组和数组列表之间的差异


LinkedList
是最坏的情况。链表被优化插入中间。除了需要分配的
Integer
对象之外,它们还有指向列表中下一项的引用和保存这些引用的节点。这是一个巨大的内存开销,也需要一些初始化,除非您希望在列表的中间插入大量元素,否则您不会使用链表。

Related:另请查看不要运行自己的基准测试。你会做错事,而且你不需要做(你肯定可以找到现有的合适的基准)。第二,即使忽略错误的基准测试,情况也是如此。阵列是最快的,但它们的大小是固定的。如果您需要一个
列表
,那么
ArrayList
是您的最佳选择,并且
LinkedList
的实际使用案例非常少。您好,无论我的基准测试程序有多差,性能问题仍然存在。正如这个链接所说,我可以忽略性能。但实际情况是我不能。ArrayList很慢,对我的工作影响很大。因此,您能否提供一些有用的建议,而不仅仅是关注基准代码的糟糕程度。谢谢。我投票决定重新讨论这个问题,我认为OP是对的,问题不是关于基准测试,而是关于提高代码的性能。OP需要添加他希望被查找的代码
===== loop0 time =======11
===== loop1 time =======6776
===== loop2 time =======17305
===== loop3 time =======56