>> i's SQUARE >> Javaのノウハウ >> Javaの高速化の方法

Javaの高速化の方法



Javaにおけるパフォーマンスがよい(レスポンスタイムが短くスループットが高い) ロジックの組み方を以下に記述致します。
しかし、あくまでパフォーマンスの最適化を目的にしてますので、 プログラムの組みやすさ、見やすさは逆に悪くなる場合がありますのでご了承下さい。


■文字列の連結には「StringBufferクラス」を使う

String str_x="aaa";
String str_y="bbb";
String str=str_x+str_y;

といった「+」の連結は処理コストがかかります。

そこで、以下のようにStringBufferクラスを使う方が効果的です。
StringBuffer sb=new StringBuffer();
sb.append(str_x);
sb.append(str_y);
String str=sb.toString();


また必要な文字列のサイズがわかる場合は
StringBuffer sb=new StringBuffer(2000);
といったようにサイズを指定するとなおベターです!

■入出力を行う場合、 java.io.BufferedOutputStreamやjava.io.BufferedInputStreamクラスを使う
 java.io.OutputStreamやjava.io.InputStreamは絶対に使用しない


以下のように入出力はBufferedクラスを使用するだけで高速化が図れます。
BufferedInputStream bis = new BufferedInputStream( new FileInputStream("ex.txt") );
またコンストラクタで適切なバッファサイズを指定すれば、更に高速化が可能です!

■オブジェクトの初期化は必要な時点で行う

■不要になった生成済オブジェクトは明示的に null を代入して解放する

String str = new String();
処理後
str=null;

■コレクションクラスは可変で便利だが、初期化時に使用するサイズを適切に指定し動的なサイズ拡張を極力抑える

Vector v = new Vector(1000);
ArrayList list = new ArrayList(1000);

また極力同期化を行わないコレクションクラスを使用する必要があります。

■配列のコピーには arraycopy メソッドを使う

■メソッドのインライン化を行う

メドッド宣言時には出来るだけfinal,private,staticの修飾子を含める。

■ループの終了条件はローカル変数にコピーする

String str="abcd";

for(int i=0; i < str.length(); i++){ System.out.println(str); }


上記は終了条件を毎回アクセスの遅いヒープ領域を使用していますが、 これをローカル変数にコピーすることで処理の高速化が図れます!

String str="abcd";

int i_length=str.length();
for(int i=0; i < i_length; i++){ System.out.println(str); }

■文字列がNULLかどうかの判断は IF分を使用せずに 例外処理NullPointerException で置き換える

処理
if (str == null) {}
を以下に置き換える

try { 処理 } catch (NullPointerException e) {}



抜け落ちたひとつの取るに足らない小さな部品は、ある歯車を狂わせ、
やがて大きな歯車の回転を狂わせていく・・・。
by Leaf「雫」