あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

パフォーマンスの改善

プログラムで、処理速度に問題がある(処理が遅い)場合に、プログラム内の処理効率の悪い部分を修正して処理効率の良いコードに書き換える必要にせまられる場合が、わりとあるものです。既に常識化しているものもありますが、あらためてまとめてみました。

効率の悪い処理の見直しチェック部分

  • 再利用可能なインスタンスは、キャッシュしておいて再利用する。
  • 無駄なキャストは行わない。頻繁にキャストしなければいけない場合は、キャストしないで、一旦キャストする必要のあるクラスのインスタンス変数に代入する。
  • synchronizedを使った同期処理は、高コストとなるので、本当に同期処理が必要な部分のみに使用する。
  • 多くの文字列の連結処理は、Stringの + 演算子より、StringBufferのappend()を使用する方が、高効率でパフォーマンスが良い。
    • StringBufferで連結後の文字列の長さがあらかじめ、わかっている場合は、StringBufferのインスタンス生成時に、コンストラクタの引数で適切な長さを指定すると、更に効率がよくなる。
  • 配列要素のコピーは、ループ文で、各配列要素への代入を行うより、System.arraycopy()を使用する。その方が高速に処理ができる。
  • Collection系の利用クラスの見直し
    • Vector, Hashtable のメソッドは、同期化されているので、効率はよくない。J2SE1.2以降であれば、同期化の必要がない場合は、Vectorの代わりにArrayListを、Hashtableの代わりにHashMapを使用する。これらのクラスのメソッドは、同期化されていない。
    • Vector, ArrayListに要素を追加/削除する場合は、末尾に対して行うほうが、先頭に対して行うより処理効率がよい。Listの途中の要素の追加/削除を行うと内部では配列のコピーが行われていて、要素数が多い場合は、パフォーマンスが低下する。なるべく末尾に対して処理するように見直す。
  • System.gc()は、必要なければ使用しない。
    • 強制的な、ガベージコレクションの実行は、パフォーマンスの低下につながるので、どうしても必要な場合以外は、使用しないようにする。