需要一些关于Java性能改进的帮助。有没有办法了解同一个调用堆栈中是否存在任何重复的方法调用(具有相同参数值的相同方法)。
为了更清楚:
MethodA(int A)
- 返回int B.
让我们说这个方法是从其他类和其他模块中调用的。在单个长链式事务中,如果使用相同的输入参数MethodA(1)
多次调用此方法,则会降低性能。相反,我认为更好的方法必须是每次使用第一次调用的结果,而不是每次都调用MethodA(1)
。
除了手动分析所有内容之外,是否可以识别重复的呼叫。现在我试图在本地缓存结果,以避免使用相同的查询参数调用相同的方法。但仍然试图识别重复的调用,以便将其缩小到根本原因。
任何帮助都将受到高度赞赏。
答案 0 :(得分: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);
}