在同一个调用堆栈中识别重复呼叫 - java

问题描述:

需要一些关于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

您必须确定给定的方法没有副作用,因为在每次调用时给定值的参数都会总是返回相同的值。

您可以使用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