2017-10-11 10 views
1

Javaでのパフォーマンスの改善についての助けが必要です。同じコールスタック内に重複したメソッド呼び出し(同じパラメーター値を持つ同じメソッド)があるかどうかを調べる方法はありますか? 同じ呼び出しスタック内で重複呼び出しを識別する - Java

はより明確にそれを維持するには、次の

MethodA(int A) - リターンは、この方法は、他のクラスの数からして、他のモジュールから呼び出されますだとします

B.

int型。このメソッドが同じ入力パラメータ MethodA(1)で複数回呼び出された場合、1つの長いチェーントランザクションでは、パフォーマンスが低下します。代わりに、より良いアプローチは毎回 MethodA(1)を呼び出すのではなく、最初の呼び出しの結果を毎回使用することでなければならないと私は信じています。

手動ですべてを分析する以外に、重複呼び出しを識別することは可能ですか?現時点では、同じクエリパラメータを持つ同じメソッドへの呼び出しを避けるため、結果をローカルにキャッシュしようとしています。しかし、依然として重複した呼び出しを特定して根本的な原因を絞り込むことができます。

ご協力いただければ幸いです。

+0

あなたは、コードを最適化しようとしていますか?その場合は、最初に[プロファイラ](https://www.ej-technologies.com/products/jprofiler/overview.html)を使用して、最適化が最も理にかなったホットスポットを示すことを強くお勧めします。 –

+0

ありがとうございました。 dynatraceを使用しますが、これは各メソッドに対して何回呼び出しを行うかを指定しますが、1回のトランザクション内で重複呼び出しが行われるかどうかを正確に識別するものではありません。行方不明で、プロファイラを使用して実現できるものがありますか? – user1785961

+0

私は、メソッドをキャッシュ可能にするのに比べて、分析に多くの時間を費やすと思います。分析のために、私は呼び出しをログしてから、ログ文をグループ化して、いくつかのグループに多くのエントリがあるかどうかを調べます。 – lexicore

答えて

1

与えられたメソッドに副作用がないことを確認する必要があります。指定されたパラメータの値を使用するすべての呼び出しで、は常にに戻ります。

CGLIBを使用してメソッド/クラス・プロキシを作成し、キャッシュインプリメンテーションを使用して、同じ入力に対して既知の結果またはキャッシュ結果を戻すことができます。

例(https://gist.github.com/ksauzz/1563486を参照):

List<String> proxyAry = (List<String>)Enhancer 
.create(TargetClass.class, new MyInvocationHandler(ary)); 

static class MyInvocationHandler implements MethodInterceptor { 

    private TargetClass<String> ary; 

    public MyInvocationHandler(TargetClass<String> ary) { 
     this.ary = ary; 
    } 

    @Override 
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { 
     if (isFouthGet(method, args)) { 
      return "Bow!!"; 
     } 
     return proxy.invoke(ary, args); 
    } 
+0

amitmahありがとうございます。はい、戻り値はすべて同じになります。しかし、私は、潜在的に同じパラメータでこのメソッドを呼び出す可能性があるすべての呼び出し元メソッドが何であるかを調べようとしています。したがって、キャッシュからの取り出しとキャッシュからの取り出しの代わりに、重複した呼び出しを避ける方法を見つけるのに役立ちます。 – user1785961

関連する問題