読者です 読者をやめる 読者になる 読者になる

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

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

まずは普通に実装

最初からパフォーマンスを気にして書いちゃうと,
何が有効で何があまり有効でないかわからなくなっちゃうので,
とりあえず普通に実装する.
(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 で最低限確保する時間をテストしているので,
後から処理が追加されて遅くなっちゃった時とかは
テストがコケてすぐにわかるようにしてます.