パフォーマンスチューニングする時の基礎の基礎

みんなパフォーマンスチューニングの環境とかってどうやってるのかなぁと
思ったので書いてみますた.
全然専門外なのでまったく自信無いですが,僕はこうやってるよって事で

まずは普通に実装

最初からパフォーマンスを気にして書いちゃうと,
何が有効で何があまり有効でないかわからなくなっちゃうので,
とりあえず普通に実装する.
(ifelse より switch の方が早いとかやっても微々たるものだし)
もちろん,後々のために TDD でやっておく.

計測環境を作る

テストケースとして記載する
重い処理を探すために,100回くらい繰り返して実行して
平均を見れるようにする.
Java の実行時最適化とかの影響もあると思うので,
最初の一回の時間と平均を見れるようにする.
assert も書いておくと,何秒以内を目指すのかが,
残せるので書いておく.

StopWatch stopWatch = new StopWatch();
List<Long> times = new ArrayList<Long>();
for(int i = 0 ; i < 100 ; i++){
	stopWatch.reset();
	stopWatch.start();
	
	foo.bar(); //計測する処理

	stopWatch.stop();
	times.add(stopWatch.getTime());
}
BigDecimal sum = new BigDecimal(0L);
for(Long i : times){
	sum = sum.add(new BigDecimal(i));
}
Long average = sum.divide(new BigDecimal(times.size())).longValue();
System.out.println("初回 : " + times.get(0) + " ms.");
System.out.println("平均 : " + average + " ms.");
assertThat(times.get(0), is(lessThan(30000L)));
assertThat(average, is(lessThan(20000L)));

一つ手を入れたら計測して記録してコミット

最初に手を入れてない状態で実行して,
とりあえず現状の時間を計測.

最初の計測
初回 : 2764 ms.
平均 : 1093 ms.

とかコミットメッセージに書いてコミット.


実際に処理が速くなると思う処理を入れたら,
速度を計測してみる.

in で検索してキャッシュ化
初回 : 1348 ms.
平均 : 622 ms.

何をしたのかもコミットメッセージに書いてコミット.

  • trac のチケットのコメントにも計測する度に記載しておくと,後で見れて便利
  • 速度の改善が見られない処理があっても上記に記載しておくと,何が有効じゃないかわかるので記載しておく

こんなかんじで環境を作ってパフォーマンスチューニング

僕はこんな感じでやってます.
assert で最低限確保する時間をテストしているので,
後から処理が追加されて遅くなっちゃった時とかは
テストがコケてすぐにわかるようにしてます.