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