最適化の章

5.2. ループ内でインスタンス化しない

『目的』

インスタンス化方法を改善してメモリ管理の負荷を下げましょう。

『Before』

ループの内部で一時オブジェクトを生成すると、 メモリを管理するためにより多くの負荷がかかってしまう可能性があります。

これは、ループ内で一時オブジェクトを生成しています。

for (int i = 0; i < max; i++) {
    StringBuilder sb = new StringBuilder();
    sb.append("loop: ")
      .append(i);
    System.out.println(sb.toString());
}

毎回StringBuilderを作っているためメモリ管理に負荷がかかります。

『After』

ループ外で作ったものをループ内で使い回すようにします。

StringBuilder sb = new StringBuilder();  /* ループ外に出した */
for (int i = 0; i < max; i++) {
    sb.append("loop: ")
      .append(i);
    System.out.println(sb.toString());
    sb.setLength(0);  /* 使い回すので内容をクリア */
}

ループを繰り返しても、インスタンスは一つだけなのでメモリ管理に負荷はかかりません。

『まとめ』

使い回せるのであれば、ループ内でインスタンス化するのは控えましょう。
大きなインスタンス(コンストラクタにおける処理コストが大きい)の場合は 実行時間にも差が出てくるでしょう。

< 前のページへ

Pagetop