我有一个接口IMath有添加,减去方法
public interface IMath {
long add(int x, int y);
long sub(int x, int y);
}
现在,实现这一目标的数学类正在拥有这些方法的主体。
public class Math implements IMath {
@Override
public long add(int x, int y) {
return x + y;
}
@Override
public long sub(int x, int y) {
return x - y;
}
}
我希望每个方法的执行时间不使用AOP,反射并且方法代码中不应该有任何更改。
请提出各种方法
答案 0 :(得分:0)
要计算执行时间而不使用AOP,反射且方法代码中没有任何更改,This可能对您有所帮助。
答案 1 :(得分:0)
除了使用可以检测代码并测量调用所用时间的分析器运行代码之外,您已排除了所有实用选项。
但是,我要注意,如果在重复调用方法的(存在)应用程序中使用此代码,则分析仅可行。即便如此,由于这些方法很短,因此难以获得可靠的测量结果。
答案 2 :(得分:0)
如果您不需要更改代码并希望添加其他行为,请使用decorator pattern并装饰现有代码:
public class MathMeasure implements IMath {
private final IMath math;
private long lastMethodTime;
public MathMeasure(IMath math) { this.math = math; }
@Override
public long add(int x, int y) {
long result;
long start = System.currentTimeMillis();
result = math.add(x, y);
long end = System.currentTimeMillis();
lastMethodTime = end - start;
return result;
}
@Override
public long sub(int x, int y) {
//same code here like in previous method
}
public long lastMethodInvokationTime() { return lastMethodTime; }
}
这是它如何工作的基本思路,您可能需要添加更复杂的时间执行日志记录。让我们看看我们在这里做了什么,使用装饰器模式你创建一些实现IMath接口的东西,然后把它放在装饰器之后随意将这一束传递给客户端(应用程序的另一部分),因为装饰器也有IMath接口而客户端看不到其他方法,但您可以在客户端使用IMath后收集数据。