AspectJで時間を計測する
どのメソッドがどれくらいの時間が掛かっているかを測るには、アスペクトを用いるのがbestだと思う。
import java.util.*; public aspect TimeAspect { static final long freq_ = PerformanceCounter.queryPerformaceFrequesncy(); HashMap map_ = new HashMap(); long start_, end_; pointcut at() : call(* *.*(..)) && !within(TimeAspect); before() : at() { start_ = PerformanceCounter.queryPerformanceCounter(); } after() : at() { end_ = PerformanceCounter.queryPerformanceCounter(); long dt = 0; if( map_.containsKey(thisJoinPoint.getSignature().toString()) ) { dt = ((Long) map_.get(thisJoinPoint.getSignature().toString())).longValue(); } dt += end_ - start_; map_.put(thisJoinPoint.getSignature().toString(), new Long(dt)); } public void result() { System.out.println("------終了-----"); Set keys = map_.keySet(); Iterator it = keys.iterator(); while(it.hasNext()) { Object key = it.next(); double value = (double) ((Long) map_.get(key)).longValue() / freq_; System.out.println(key.toString() + ":" + value); } } }
PerformanceCounterは以前つくった、QueryPerformanceCounter/Frequescy APIを呼び出すもの。
最後に結果を表示するときは、
TimeAspect.aspectOf().result();
とやる。aspectOf()がダサいが、しかたないでしょう。