TOP設計・移行・活用> 繰り返し処理中のオブジェクトの生成は最小限にする(C_CTR009)
Javaコーディング規約
Javaコーディング規約

第10回:制御構造に関する規約
著者: 電通国際情報サービス  高安 厚思、東田 健宏
レッドフォックス  石井 宏和
   2005/12/21
前のページ  1  2  3   4  次のページ
繰り返し処理中のオブジェクトの生成は最小限にする(C_CTR009)

   繰り返し回数の多いループの内部でオブジェクトを生成すると生成に時間がかかります。そのため回数によってはパフォーマンス低下につながることがあります。これより、なるべく可読性を低下させない範囲でループ外でインスタンスを作成しそれを再利用するようにします。

   特に、複数のユーザがサーバサイドでインスタンスを繰り返し生成するようなWebアプリケーションの場合、ガベージコレクションが実行されるとパフォーマンスの低下を招きます。以下の例を見てみましょう。

パフォーマンスが悪い例
List arrayList = new ArrayList();
for (int i = 0; i<10000; i++) {
     arrayList.add(new Integer( i ));
}
//繰り返し処理
Iterator iterator = arrayList.iterator();
while ( iterator.hasNext() ) {
     //ループ内でチェックオブジェクトを生成
     Checker checker = new Checker();
     if ( obj instanceof Integer) {
          Integer integer = (Integer)iterator.next();
          checker.checkInteger( integer );
     }
}

   上記の例では、Checkerクラスのインスタンスの生成がブロック内で行われています。ここで生成されたインスタンスは、ブロックを抜けた時に自動的にガベージコレクションが実行され、インスタンスが削除されます。

   ArrayListには現在10000のオブジェクトが格納されており、ループ中に10000個のCheckクラスのインスタンスが生成されるため、パフォーマンスの低下につながります。

パフォーマンスが良い例
List arrayList = new ArrayList();
for ( int i = 0; i<10000; i++ ) {
     arrayList.add(new Integer( i ));
}
Iterator iterator = arrayList.iterator();
// ループブロック外で生成
Checker checker = new Checker();
while ( iterator.hasNext() ) {
     if ( obj instanceof Integer ) {
          Integer integer = (Integer)iterator.next();
          // チェック処理を使いまわす
          checker.checkInteger( integer );
     }
}

   一方、上記の例では、無駄なインスタンスの生成を減らすことができます。ただしCheckerの変数スコープが広がってしまいますので、変数スコープ変更によるバグの発生率が高くなるか、パフォーマンスが向上するかといった点ではトレードオフとなります。

   パフォーマンスに関することは計測してから修正するのが定石ですが、このように明らかに修正できる場合は修正すべきでしょう。

   なお、この規約はJava特有のものではありません。

前のページ  1  2  3   4  次のページ


株式会社電通国際情報サービス 開発技術センター 高安 厚思
著者プロフィール
株式会社電通国際情報サービス  高安 厚思
株式会社電通国際情報サービス 開発技術センター
Java(J2EE)/オブジェクト指向の研究開発やプロジェクト支援、開発コンサルティングに従事。モデル、アーキテクチャ、プロセスが探求対象。今回は Javaコーディング規約2004の仕掛け人。


株式会社電通国際情報サービス 開発技術センター 東田 健宏
著者プロフィール
株式会社電通国際情報サービス  東田 健宏
株式会社電通国際情報サービス 開発技術センター
CTI、Webアプリの開発経験を経て、現在は主にプロジェクトマネジメント支援、プロセスエンジニアリング、ソフトウェア工学研究開発に従事。最近はコーチング、ファシリテーションといったヒューマン系スキルに興味を持ち日々修得に努めている。


レッドフォックス株式会社 石井 宏和
著者プロフィール
レッドフォックス株式会社  石井 宏和
レッドフォックス株式会社 システムインテグレーションサービス1部所属
主に現在までJavaによるスタンドアロンアプリ・WEBアプリケーションの開発および保守に従事。現在は何故かABAPによる保守業務も担当。また日経新聞の記事感想を日課として、1年間社内で書き続けた。「綺麗なコーディングは綺麗な文章から」をモットーに、コーディング・文章センスを共に磨いている。


INDEX
第10回:制御構造に関する規約
  はじめに
  if/whileの条件式で"="は利用しない(C_CTR003)
繰り返し処理中のオブジェクトの生成は最小限にする(C_CTR009)
  if文とelse文の繰り返しやswitch文の利用はなるべく避け、オブジェクト指向の手法を利用する(C_CTR010)