为什么创建初始容量较慢的ArrayList?

时间:2016-08-05 16:05:13

标签: java arraylist

比较创建大型ArrayList和intialCapacity我发现它;比没有一个更快地创建它。这是我为测量它而编写的简单程序:

long start2 = System.nanoTime();
List<Double> col = new ArrayList<>(30000000); // <--- Here
for (int i = 0; i < 30000000; i++) {
    col.add(Math.sqrt(i + 1));
}
long end2 = System.nanoTime();
System.out.println(end2 - start2);
System.out.println(col.get(12411325).hashCode() == System.nanoTime());

ArrayList<>(30000000)的平均结果:6121173329

ArrayList<>()的平均结果:4883894100

在我的机器上。我认为创建一次大型数组会更快,而不是在我们超出当前基础数组ArrayList的容量后重新创建它。最终我们应该最终得到大于或等于30000000的数组大小。

我认为这是优化,但实际上是悲观。为什么?

1 个答案:

答案 0 :(得分:6)

  

我多次运行同一个程序。它不在循环中

考虑如何分析代码 - 如果同时包含&#39;加速时间&#39; (考虑 JIT 等内容)并且对几个调用进行平均(收集一些统计/分布),时间可能会导致您得出不同的结论。例如:

public static void main(String[] args){
    //Warm up
    System.out.println("Warm up");
    for ( int i = 0; i < 5; i++ ){
        dynamic();
        constant();
    }
    System.out.println("Timing...");
    //time
    long e = 0;
    long s = 0; 
    int total = 5;
    for ( int i = 0; i < total; i++ ){
        long e1 = dynamic();
        System.out.print(e1 + "\t");
        e += e1;
        long s1 = constant();
        System.out.println(s1);
        s += s1;
    }
    System.out.println("Static Avg: " + (s/total));
    System.out.println("Dynamic Avg: " + (e/total));

}

private static long dynamic(){
    long start2 = System.currentTimeMillis();
    List<Double> col = new ArrayList<>();
    for (int i = 0; i < 30000000; i++) {
        col.add(Math.sqrt(i + 1));
    }
    long end2 = System.currentTimeMillis();
    return end2 - start2;
}

private static long constant(){
    long start2 = System.currentTimeMillis();
    List<Double> col = new ArrayList<>(30000000); 
    for (int i = 0; i < 30000000; i++) {
        col.add(Math.sqrt(i + 1));
    }
    long end2 = System.currentTimeMillis();
    return end2 - start2;
}

在我的系统设置中,初始容量总是更快,但不是任何数量级。

修改:根据评论中的建议,请考虑阅读How do I write a correct micro-benchmark in Java?