ArrayList の初期化サイズは指定すべきか?

実験してみました。

  • 環境
  • ソース
    • ひたすら List#add するクラス
package lab.list;

import java.util.List;

public final class ListExtender {

    private static final String LIST_ELEMENT = "abcdefghijklmnopqrstuvwxyz0123456789";

    public void extendList(List<String> list, int size) {
        for (int i = 0; i < size; i++) {
            list.add(LIST_ELEMENT);
        }
    }
}
    • ListExtender#extendList の実行時間を測定するクラス
package lab.list;

import java.util.ArrayList;
import java.util.List;

public final class ListExtendTimer {

    private long startTime;

    public long run(int initialCapacity, int size) {
        List<String> list = new ArrayList<String>(initialCapacity);
        return timeListExtending(list, size);
    }

    public long run(int size) {
        List<String> list = new ArrayList<String>();
        return timeListExtending(list, size);
    }

    private long timeListExtending(List<String> list, int size) {
        ListExtender creator = new ListExtender();
        setStartTime();

        creator.extendList(list, size);

        return System.currentTimeMillis() - getStartTime();
    }

    private long getStartTime() {
        return startTime;
    }

    private void setStartTime() {
        this.startTime = System.currentTimeMillis();
    }
}
    • Main クラス
package lab.list;

public final class ListPerformanceTest {

    public static void main(String[] args) {
        execute(     10, 3000000);
        execute(    100, 3000000);
        execute(   1000, 3000000);
        execute(  10000, 3000000);
        execute( 100000, 3000000);
        execute(1000000, 3000000);
        execute(2000000, 3000000);
        execute(3000000, 3000000);
        execute(4000000, 3000000);
        execute(5000000, 3000000);
        execute(6000000, 3000000);
    }

    private static void execute(int init, int size) {
        ListExtendTimer timer = new ListExtendTimer();

        System.out.printf("初期化サイズ: %d / 追加回数: %d\n", init, size);
        
        final int numOfRun = 10;
        long resultTotal = 0;
        for (int i = 0; i < numOfRun; i++) {
            long result = timer.run(init, size);
            resultTotal += result;
            
            printResult(result);
        }
        System.out.println("-----");
        System.out.printf("平均: %d msec.\n\n", (resultTotal / numOfRun));
    }

    private static void printResult(long executeTime) {
        System.out.printf("実行時間: %d msec.\n", executeTime);
    }
}
  • 実行結果
初期化サイズ: 10 / 追加回数: 3000000
実行時間: 344 msec.
実行時間: 156 msec.
実行時間: 219 msec.
実行時間: 219 msec.
実行時間: 250 msec.
実行時間: 203 msec.
実行時間: 187 msec.
実行時間: 203 msec.
実行時間: 204 msec.
実行時間: 265 msec.
        • -
平均: 225 msec. 初期化サイズ: 100 / 追加回数: 3000000 実行時間: 219 msec. 実行時間: 219 msec. 実行時間: 218 msec. 実行時間: 219 msec. 実行時間: 297 msec. 実行時間: 219 msec. 実行時間: 219 msec. 実行時間: 218 msec. 実行時間: 219 msec. 実行時間: 219 msec.
        • -
平均: 226 msec. 初期化サイズ: 1000 / 追加回数: 3000000 実行時間: 187 msec. 実行時間: 203 msec. 実行時間: 219 msec. 実行時間: 234 msec. 実行時間: 219 msec. 実行時間: 219 msec. 実行時間: 234 msec. 実行時間: 219 msec. 実行時間: 218 msec. 実行時間: 219 msec.
        • -
平均: 217 msec. 初期化サイズ: 10000 / 追加回数: 3000000 実行時間: 281 msec. 実行時間: 235 msec. 実行時間: 234 msec. 実行時間: 266 msec. 実行時間: 265 msec. 実行時間: 250 msec. 実行時間: 266 msec. 実行時間: 250 msec. 実行時間: 266 msec. 実行時間: 250 msec.
        • -
平均: 256 msec. 初期化サイズ: 100000 / 追加回数: 3000000 実行時間: 218 msec. 実行時間: 219 msec. 実行時間: 219 msec. 実行時間: 219 msec. 実行時間: 218 msec. 実行時間: 219 msec. 実行時間: 219 msec. 実行時間: 219 msec. 実行時間: 218 msec. 実行時間: 219 msec.
        • -
平均: 218 msec. 初期化サイズ: 1000000 / 追加回数: 3000000 実行時間: 187 msec. 実行時間: 188 msec. 実行時間: 172 msec. 実行時間: 188 msec. 実行時間: 187 msec. 実行時間: 188 msec. 実行時間: 187 msec. 実行時間: 188 msec. 実行時間: 187 msec. 実行時間: 188 msec.
        • -
平均: 186 msec. 初期化サイズ: 2000000 / 追加回数: 3000000 実行時間: 62 msec. 実行時間: 157 msec. 実行時間: 125 msec. 実行時間: 140 msec. 実行時間: 125 msec. 実行時間: 78 msec. 実行時間: 62 msec. 実行時間: 110 msec. 実行時間: 78 msec. 実行時間: 78 msec.
        • -
平均: 101 msec. 初期化サイズ: 3000000 / 追加回数: 3000000 実行時間: 63 msec. 実行時間: 62 msec. 実行時間: 47 msec. 実行時間: 62 msec. 実行時間: 63 msec. 実行時間: 63 msec. 実行時間: 62 msec. 実行時間: 63 msec. 実行時間: 46 msec. 実行時間: 63 msec.
        • -
平均: 59 msec. 初期化サイズ: 4000000 / 追加回数: 3000000 実行時間: 62 msec. 実行時間: 62 msec. 実行時間: 63 msec. 実行時間: 63 msec. 実行時間: 62 msec. 実行時間: 63 msec. 実行時間: 47 msec. 実行時間: 62 msec. 実行時間: 62 msec. 実行時間: 63 msec.
        • -
平均: 60 msec. 初期化サイズ: 5000000 / 追加回数: 3000000 実行時間: 62 msec. 実行時間: 62 msec. 実行時間: 62 msec. 実行時間: 47 msec. 実行時間: 63 msec. 実行時間: 62 msec. 実行時間: 62 msec. 実行時間: 63 msec. 実行時間: 47 msec. 実行時間: 63 msec.
        • -
平均: 59 msec. 初期化サイズ: 6000000 / 追加回数: 3000000 実行時間: 47 msec. 実行時間: 62 msec. 実行時間: 62 msec. 実行時間: 62 msec. 実行時間: 62 msec. 実行時間: 47 msec. 実行時間: 63 msec. 実行時間: 63 msec. 実行時間: 63 msec. 実行時間: 62 msec.
        • -
平均: 59 msec.