2017-10-11 45 views
1

需要一些關於Java性能改進的幫助。有什麼方法可以理解在同一個調用棧中是否有任何重複的方法調用(具有相同參數值的相同方法)。在同一個調用堆棧中識別重複呼叫 - java

爲了保持更加清晰:

MethodA(int A) - 返回int B.

比方說,這種方法從其他類的數量,並從其他模塊調用。如果使用相同輸入參數MethodA(1)多次調用此方法,那麼在單個長鏈交易中,它會降低性能。相反,我認爲更好的方法必須是每次都使用第一次調用的結果,而不是每次調用MethodA(1)

是否可以識別重複呼叫,而不是手動分析所有內容。現在我試圖在本地緩存結果,以避免使用相同的查詢參數調用相同的方法。但仍嘗試識別重複呼叫,以便將其縮小到根本原因。

任何幫助將不勝感激。

+0

你是不是想優化代碼?在那種情況下,我強烈建議首先使用[profiler](https://www.ej-technologies.com/products/jprofiler/overview.html),它將指出優化最有意義的熱點。 –

+0

謝謝你的時間Rutte。我們使用dynatrace,但它確定了每種方法調用的次數,但不是確定是否在單個事務中進行了重複調用。是否有某些東西丟失,可以通過探查器來實現。 – 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