プログラム悪戦苦闘日記

はてなダイアリーからの移行(遺物)

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()がダサいが、しかたないでしょう。