知っていると便利な章

4.10. 初期容量を定める

『目的』

初期容量設定を設定してパフォーマンスを向上させましょう。

『Before』

これは、初期容量を設定していません。

private List<Object> v = new ArrayList<>();  // 初期容量未設定

public void addObjects(Object[] o) {
    // デフォルトの容量よりも配列が長い場合は List サイズを拡張しなければならない
    for (Object obj : o) {
        v.add(obj);
    }
}

100000回の繰り返し処理で7.3ms要しました。

配列の容量を拡張すると、より広範な配列が割り当てられて古い配列の内容が 新しい配列にコピーされます。その結果、ガベージコレクタによって 古い配列オブジェクトが再生されます。配列の拡張には時間がかかります。

『After』

初期容量を適切に定めることで容量確保の為のオーバーヘッドを無くすことができます。

private List<Object> v = new ArrayList<>(100000); // 初期容量設定

public void addObjects(Object[] o) {
    for (Object obj : o) {
        v.add(obj);
    }
}

100000回の繰り返し処理は 4.7msで済みました。

『まとめ』

初期容量が予め推測できるのであればパフォーマンスの向上のために設定しましょう。

< 前のページへ

Pagetop