2009-09-02 19 views
8

私はメソッドの実行時間を簡単にプロファイルし、パッケージフィルタでプロファイルするものを選択する機能やソフトウェアを探しています。メソッドのプロファイリング(基本実行時間)Spring AOPで

私はそれがプロファイラ101だと知っています。 TPTPプロファイラを使用します。しかし、私はそれに満足していない。率直に言うと、私はそれがどのように動作するのか分かりません。アプリケーションをプロファイリングするとき(プロファイリングモードでサーバーを起動するとき)、何もしないことは永遠に必要です。 (まあ、私が期待するものではなく、実行時間の単純な出力)

私はシステム時間で自分自身をプロファイリングします(メソッドの最初と最後に行を追加します)。そう悪くはない。

私の質問は:Spring AOPでメソッド呼び出しの前後でシステム時間を測定したいのですが、私に指示を与えることができますか?それは良い/悪い考えですか?コードベースはかなり大きく、単体テストはあまりありません。危険ではありませんか?

私はコードを求めていないよ、私はリンクのこの種でそれを自分で行うことができると思います。 http://static.springsource.org/spring/docs/2.5.x/reference/aop.html

しかし、あなたは素敵なチュートリアルを(前にAOPをやったことがない、ただのコンセプトを知っている)がある場合は、私はそれを取ります。

+0

アプリケーションはすでにスプリング駆動ですか? Spring管理Beanの一部であるメソッドをプロファイリングしようとしていますか? – skaffman

+0

はい、ほとんどのアプリケーションはSpring-Drivenです。そして、私がプロファイルしたいメソッドはSpring Beanの一部です –

+0

@AntoineClavalあなたはこれに答えてください:http://stackoverflow.com/questions/44070523/wrap-a-別のアスペクトのスプリングアスペクト –

答えて

13

春にはそれがサポートされています。

私はチュートリアルを探しましたが、驚くほど私は見つからなかったので、ここで説明しようとします。 (編集:私は私のブログhereにこの例を追加しました)

は、基本的には何が必要のようCustomizableTraceInterceptorクラスを拡張することです:

public class MyTraceInterceptor extends CustomizableTraceInterceptor { 

    protected void writeToLog(Log logger, String message, Throwable ex) { 
    if (ex != null) { 
     logger.info(message, ex); 
    } else { 
     logger.info(message); 
    } 
    } 


    protected boolean isInterceptorEnabled(MethodInvocation invocation, Log logger) { 
    return true; 
    } 
} 

パラメータを含むこのクラスのあなたの豆の周りにラップ、出力メソッドの呼び出し情報、戻り値と実行時間をログに記録します。 writeToLog()メソッドを変更すると、データの出力先とその重大度を制御できます。

今、あなたが実際にあなたがラップしようとしている豆を選択するためにいくつかのXMLが必要です

<!-- Tracing --> 

<bean name="traceInterceptor" class="MyTraceInterceptor" dependency-check="none"> 

    <property name="enterMessage" value="ENTER: $[targetClassShortName].$[methodName]($[arguments])"/> 

    <property name="exitMessage" 

       value="EXIT: $[targetClassShortName].$[methodName]() : $[invocationTime]ms : $[returnValue]"/> 

</bean> 

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" dependency-check="none"> 

    <property name="beanNames" value="*RequestListener,*Notifier"/> 

    <property name="proxyTargetClass" value="true"/> 

    <property name="interceptorNames"> 

     <list> 

      <value>traceInterceptor</value> 

     </list> 

    </property> 

    <property name="order" value="2"/> 

</bean> 

基本的に、あなたは「beanNames」と「注文」にワイルドカードでラップしたい豆は順序を制御定義あなたが他のAOPクラスを持っていない場合、それを削除することができます。 enterMessageプロパティとexitMessageプロパティを変更すると、出力の形式を変更することもできます。

これで十分です。説明が必要な場合は、躊躇しないでください。

+0

ここに警告の単語があります。実行時間をmsで指定するSpring StopWatchに渡します。それをns AFAIKに変更することはできません。 – Jon

+0

@ジョン、グレゴリー - あなたはこれに答えることができます:http://stackoverflow.com/questions/44070523/wrap-a-spring-aspects-with-another-aspect –

1

AOPのアプローチは機能しますが、情報をログに記録する方法によっては、パフォーマンス自体に影響を与える可能性があります。ただそれに注意してください。ロギングができるだけ効率的であることを確認してください。あなたの面で。

Visual VMと思っているかもしれません。私はこのツールに感心しました。使いやすく、最後に使用したときに必要な情報だけを提供することができました。

+0

あなたはこれに答えてください:http://stackoverflow.com/questions/44070523/wrap-a-spring-aspects-with-otherother-aspect –

1

ニックが別の良い(そして開発のための)ソフトウェアを述べたVisualVMの横にはOracle JRockit Mission Controlです。その管理コンソールhas the abilityいくつかのメソッドの単純なプロファイル呼び出し(さらに、プロファイリングオプションが多く、TPTPよりもはるかに高速です)。

メソッド呼び出し前/後の測定と同様に、基本的には動作しますが、マイナーな「欠陥」があります(バックグラウンドアプリケーションでは結果を変更することができます)。

私は個人的にVisualVMまたはJRockit Mission Controlを使用します。

1

「プロファイラ101」の問題点は、正当化が健全な思考よりも重要な問題である多くのアイデアを具体化していることです。

パフォーマンス上の問題を見つける最も良い方法は、パフォーマンスを測定することです。

これはトップダウンの考え方です。政府の予算を見てみると、無駄を見つけようとするようなものです。代わりに、お金または時間のいずれかのいくつかのランダムなユニットを選ぶなど、(が完全にであることを決定する)最も重要なもののようなボトムアップアプローチがあります。

無駄がある場合は、すぐに見つけられます。その理由は単純です。たとえば、ある割合(たとえば40%)が無駄になっている場合、サンプルの割合(平均)は、それがどのように浪費されているかを正確に示します。

This is the language-agnostic method I use.

ADDED:あなたはそれを想像することはできませんので、40%のような大部分は、非現実的だと思うことがあり、but it's entirely possible

+0

これに答えることができます:http:// stackoverflow。 com/questions/44070523 /別のアスペクトのラップアラート –

関連する問題