计算java中方法执行的时间

时间:2017-10-30 08:53:14

标签: java oop interface

我有一个接口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,反射并且方法代码中不应该有任何更改。

请提出各种方法

3 个答案:

答案 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后收集数据。