人工知能であそぶ

人工知能をつくってあそぶ.あと個人的な勉強のメモ.

Java高速化のための備忘録

はじめに

 人工知能は全般的に重たい処理が多いため,一つ一つの処理を軽くする努力が必要である.試行錯誤して早くなった処理をメモしておく.タイマーなどの誤差もあり,平均を取ってもばらつきがあったので有効数字はあえて1桁にしてある.

計測環境

 CPU:2.5 GHz Intel Core i5
 メモリ:16GB 1600 MHz DDR3
 OS:OS X El Capitan 10.11.4
 IDEEclipse Neon Release (4.6.0)

以下の // --------------------------------------------- // で括られた区間を変更することで様々な処理の実行時間を計測した.いずれも,1000回の平均をとった.

public static final int TRIAL_NUM = 1000;
	
public static void main(String[] args) {
	double timeSum = 0;
	for (int trial = 0; trial < TRIAL_NUM; trial++) {
		double start = System.nanoTime(); // 計測開始
		// --------------------------------------------- //
		//
		//   計測する処理
		//
		// --------------------------------------------- //
		double end = System.nanoTime();   // 計測終了
		timeSum += end - start;           // 今回の計測時間
	}
	double timeAve = timeSum / (double)TRIAL_NUM; // 今回の計測時間
	System.out.println("Time:" + timeAve / 1000000 + "ms");
}

println

 デバッグで吐き出した文章などをそのままにしているととても遅い.
 0~99までの100個の数値を上書きし代入するとき,printの有無でそれぞれかかる時間を計測した.

  • printlnなし:Time:0.001ms
  • printlnあり:Time:0.5ms

・printlnなし

int a = 0;
for(int i = 0; i < 100; i++){
	a = i;
}

・printlnあり

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

String型文字列の末尾への追加(加算)

 0~99までの100個の数値をStringに直し,末尾に追加して行った時の時間を,それぞれの追加方法において計測した.StringBufferとStringBuilderは違いがわからなかった(2017/02/05 追記:StringBuilderはスレッドセーフではないので並列化が必要な時はStringBufferを使うようにする必要がある.)ので1000個にして試したところ,StringBuilderが速かった.日本語wikipedia全体(5.5GBくらいのテキストファイル)やツイッターなどを自然言語処理したいときは,これを使わないと詰む.

  • +演算子:Time:0.07ms
  • concat:Time:0.04ms
  • StringBuffer:Time:0.02ms(1000個:0.12ms)
  • StringBuilder:Time:0.02ms(1000個:0.10ms)

・+演算子

String s = "";
for(int i = 0; i < 100; i++){
	s += String.valueOf(i);
}

・concat

String s = "";
for(int i = 0; i < 100; i++){
	s = s.concat(String.valueOf(i));
}

・StringBuffer

String s = "";
StringBuilder buf = new StringBuilder();
for(int i = 0; i < 100; i++){
	buf.append(String.valueOf(i));
}
s = buf.toString();

・StringBuilder

String s = "";
StringBuilder buf = new StringBuilder();
for(int i = 0; i < 100; i++){
	buf.append(String.valueOf(i));
}
s = buf.toString();

あとがき

気がついたら追加していく

参考資料

qiita.com