 |
|
| 前のページ 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年間社内で書き続けた。「綺麗なコーディングは綺麗な文章から」をモットーに、コーディング・文章センスを共に磨いている。
|
|
 |
|
 |
|