1

いくつかの (静的) Java メソッドがあります。

これらのメソッドの実行時に発生するポイントカットがあります。

pointcut calculation() : execution(* myMethod_*(..));

ここで、各実行の時間を個別に測定したいと思います。問題は、他の実行がまだ実行されている間に、実行がいつでも開始される可能性があることです。before()との 2 つのアドバイスについて考えましafter()た。これらは、発信者を識別して、さまざまな発信者のタイマーを管理します。

before() : calculation() {

}

after() : calculation() {

}

どうすればそれを実装できますか?

4

3 に答える 3

2

around() アドバイスはうまくいくはずです:

   Object around() : calculation() {
        long start = System.nanoTime();
        Object result = proceed();
        long end = System.nanoTime();
        logger.info(String.format("%s took %d ns", thisJoinPointStaticPart.getSignature(),
                (end - start)));
        return result;
    }
于 2012-08-03T17:31:37.147 に答える
1

Bijuの答えにはコメントできないので、新しいものを作成しています:

あなたは尋ねました:

問題があります: 「アドバイス [...] が適用されていません [Xlint:adviceDidNotMatch]」 - ポイントカットが Java メソッドと一致しなくなったようです

さて、どのように一致させるべきですか?静的メソッドを実行すると(あなたは自分で言った)、thisオブジェクトがないので、ポイントカットcall()execution(). 以下は、デモ用に作成した完全なコード サンプルです。

アプリケーション クラス:

package de.scrum_master.aspectj.sample;

import java.util.Random;

public class Dummy {
    static Random random = new Random();

    static void myMethod_one() throws InterruptedException {
        Thread.sleep(random.nextInt(1000));
    }

    static String myMethod_two(int dummy) throws InterruptedException {
        Thread.sleep(random.nextInt(1000));
        return "dummy";
    }

    static int myMethod_three(double foo, String... dummy) throws InterruptedException {
        Thread.sleep(random.nextInt(1000));
        return -1;
    }

    public static void main(String[] args) throws InterruptedException {
        // We have no "this" here (static method), so advice is not applied
        myMethod_two(5);
        myMethod_one();
        myMethod_three(7.7, "foo", "bar");

        // Now let's create an object, so we have "this"
        new Dummy().doStuff();
    }

    void doStuff() throws InterruptedException {
        // Here advice is applied because we have "this"
        myMethod_one();
        myMethod_two(5);
        myMethod_one();
        myMethod_three(7.7, "foo", "bar");
        myMethod_three(3.3, "zot", "baz");
        myMethod_two(11);
    }
}

タイミングの側面:

package de.scrum_master.aspectj.sample;

aspect TimingAspect {
    pointcut calculation(Object thisObject) :
        call(* myMethod_*(..)) && this(thisObject);

    Object around(Object thisObject) : calculation(thisObject) {
        long start = System.nanoTime();
        Object result = proceed(thisObject);
        long end = System.nanoTime();
        System.out.println(String.format(
            "%s (this = %s) took %d ns",
            thisJoinPointStaticPart.getSignature(),
            thisObject,
            end - start
        ));
        return result;
    }
}
于 2012-08-10T11:08:39.960 に答える
0

最良の方法は、開始クロックと終了クロックを持つオブジェクトで各メソッドをラップすることです。以下を使用できます。

System.nanoTime();

開始時刻と終了時刻を保存します。したがって、前後の呼び出しで開始時間と終了時間の値を設定できます。または、それらを開始を設定し、メソッドを実行してから終了を設定する実行コマンドにラップすることもできます。

メソッドをオブジェクトにラップすることで、タイミング制御をそのオブジェクトに抽象化し、好きなだけ並列に実行できます。それぞれが独自のメソッドのタイミングを担当します。

于 2012-08-03T17:24:18.373 に答える