リストの初期容量のテスト2015/12

テスト概要

  • リストの初期容量による実行速度の違いを知りたい。
  • デフォルトサイズ(初期容量10)と、初期容量百万の2つのArrayListを用意して。百万回Integerクラスをaddすることを2回繰り返し、それぞれの所要時間を計測する。


テスト環境

マシン : 東芝 dynabook R73/W6M
CPU : i7-4710MQ 2.50GHz
MEM : 8GB
OS : Windows 8.1 64bit
Java : 1.8.0.31
Eclipse : 4.4.1


実行プログラムコード

import java.util.ArrayList;

/**
 * ArrayListの初期容量を変えてループを計測するプログラム。
 */
public class ListSpeed {

  public static void main(String[] args) {

    // アイドリング
    for (int i = 0; i < 100; i++) {
        System.out.println("Do Initialize..." + i);
    }

    ListSpeed obj = new ListSpeed();
    long withDefault = 0L;
    long withMilion = 0L;

    // 百万回ずつループ
    for (int i = 0; i < 100; i++) {
      withDefault += obj.newWithDefault();
      withMilion += obj.newWithMillion();
    }

    // 中休み
    for (int i = 0; i < 100; i++) {
        System.out.println("Now Breaking..." + i);
    }

    // 百万回ずつループ
    for (int i = 0; i < 100; i++) {
        withMilion += obj.newWithMillion(); withDefault += obj.newWithDefault();
    }

    // 結果を表示
    System.out.println("withDefault : " + withDefault);
    System.out.println("withMilion : " + withMilion);
  }

  ListSpeed() {}

  long newWithDefault() {
  long then = System.currentTimeMillis();

  // 初期値10でリストを初期化
  ArrayList list = new ArrayList();

  // 百万回ループ
  for (int i = 0; i < 1000000; i++) {
    list.add(i);
  }

  long now = System.currentTimeMillis();
    return now - then;
  }

  long newWithMillion() {
  long then = System.currentTimeMillis();

  // 初期値百万でリストを初期化
  ArrayList list = new ArrayList(1000000);

  // 百万回ループ
  for (int i = 0; i < 1000000; i++) {
    list.add(i);
  }

  long now = System.currentTimeMillis();
    return now - then;
  }
}
テスト結果〈ミリ秒)
  初期容量10(デフォルト) 初期容量1,000,000
1回目 1771 1136
2回目 1732 1300
3回目 1819 1009
4回目 1924 1138
5回目 1738 1133
6回目 1793 1036
7回目 1738 1158
8回目 1765 1250
9回目 1737 1138
10回目 1691 1294
平均 1770.8 1159.2


結論

  • デフォルトサイズ(初期容量10)のときよりも、初期容量百万の方が、約1.5倍速い。
  • リストの初期容量を適切に設定すると、プログラムの実行速度が早くなる。