Re:595

595 :デフォルトの名無しさん :05/02/09 13:09:55
>>593
>>592は、アスペクト有る無しで15倍違うという結果は怪しいってだけで本題じゃないんだ。
(とは言っても、Sunのクライアントコンパイラはそこまでやらないはずなので
以下のオーバーヘッドを除けば、まず正しいと思う。)
で、本題のCGLIBとASMの比較。
コンパイル前(1)、コンパイル(2)、コンパイル後(3)、全部纏めて測定しているのはどうだろうか。
俺は3だけ欲しい。が、これは体感値だと言われればぐうの音も出ない。
そこまで望むなら自分でやれと言われれば、いやあ御尤も。

うーん,うーん,ごめんなさい.「コンパイル」が何を意味しているか分かりません.m(__)m
バイトコードを生成したりそのクラスをロードしたりすること?
だとしたら「全部纏めて測定」してませんけど...
そういえば,どこからどこまでを測定したか書いてなかったですね.
こんな感じです (S2Unit を使っています).

    public void testCall() throws Exception {
        Hoge hoge = (Hoge) getComponent(Hoge.class);

        long t1 = System.currentTimeMillis();
        for (int i = 0; i < TIMES; ++i) {
            hoge.foo();
        }
        long t2 = System.currentTimeMillis();
        for (int i = 0; i < TIMES; ++i) {
            hoge.bar();
        }
        long t3 = System.currentTimeMillis();

        System.out.println(Long.toString(t2 - t1) + "\t" + Long.toString(t3 - t2));
    }

そんなわけで (どんなわけで?),アスペクトを適用したクラスの生成 (コンテナの初期化時に行われる) はもちろん,インスタンス化も終わっているので,単純にメソッド呼び出しを繰り返した時間だけを測定しています.のつもりです.


03:00 追記
あ,分かったかも.HotSpot によるコンパイルのことかな? そうか,最初 (592) からそういう話題だったか.orz
そんなわけで (どんなわけで?),上記の測定コードでコンポーネントを取ってきてから t1 の時刻を取得する前に 1000 回ほどループ回して foo()bar() を温めてやりましたが...
誤差以上の差は見られず.(^^;