みんなパフォーマンスチューニングの環境とかってどうやってるのかなぁと
思ったので書いてみますた.
全然専門外なのでまったく自信無いですが,僕はこうやってるよって事で
まずは普通に実装
最初からパフォーマンスを気にして書いちゃうと,
何が有効で何があまり有効でないかわからなくなっちゃうので,
とりあえず普通に実装する.
(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 で最低限確保する時間をテストしているので,
後から処理が追加されて遅くなっちゃった時とかは
テストがコケてすぐにわかるようにしてます.