java - 如何记录一个接口(interface)所有实现的每个方法的时间成本

标签 java debugging methods

我有一个包含三个方法start()rollback()retry()的接口(interface),并且该接口(interface)可能有很多实现假设有两个FisrtImplSecondImpl,如何记录FisrtImplSecondImplstart()rollback()retry() 时间成本?

我发现可能的问题Record every method execution ,但答案不是我想要的。

最佳答案

编写一个对方法进行计时的代理实现。

public class FooTiming implements Foo {
    private final Foo foo;
    private long startTime;
    private long rollbackTime;
    private long retryTime;
    public FooTiming(Foo foo) {
        this.foo = foo;
    }
    @Override
    public void start() {
        long enter = System.nanoTime();
        this.foo.start();
        long exit = System.nanoTime();
        this.startTime += exit - enter;
    }
    @Override
    public void rollback() {
        long enter = System.nanoTime();
        this.foo.rollback();
        long exit = System.nanoTime();
        this.rollbackTime += exit - enter;
    }
    @Override
    public void retry() {
        long enter = System.nanoTime();
        this.foo.retry();
        long exit = System.nanoTime();
        this.retryTime += exit - enter;
    }
    @Override
    public String toString() {
        return String.format("start = %.3f ms, rollback = %.3f ms, retry = %.3f ms",
                             this.startTime / 1e6, this.rollbackTime / 1e6, this.retryTime / 1e6);
    }
}

测试

interface Foo {
    void start();
    void rollback();
    void retry();
}
class FirstImpl implements Foo {
    @Override public void start()    { try { Thread.sleep(200); } catch (InterruptedException ignored) {} }
    @Override public void rollback() { try { Thread.sleep(150); } catch (InterruptedException ignored) {} }
    @Override public void retry()    { try { Thread.sleep(170); } catch (InterruptedException ignored) {} }
}
class SecondImpl implements Foo {
    @Override public void start()    { try { Thread.sleep(120); } catch (InterruptedException ignored) {} }
    @Override public void rollback() { try { Thread.sleep(140); } catch (InterruptedException ignored) {} }
    @Override public void retry()    { try { Thread.sleep(160); } catch (InterruptedException ignored) {} }
}
public static void main(String[] args) {
    test("FirstImpl", new FirstImpl());
    test("SecondImpl", new SecondImpl());
}
private static void test(String name, Foo foo) {
    FooTiming timing = new FooTiming(foo);
    timing.start();
    timing.rollback();
    timing.retry();
    System.out.println(name + ": " + timing);
}

输出

FirstImpl: start = 201.505 ms, rollback = 150.611 ms, retry = 170.358 ms
SecondImpl: start = 122.426 ms, rollback = 140.017 ms, retry = 160.381 ms

关于java - 如何记录一个接口(interface)所有实现的每个方法的时间成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61378418/

相关文章:

c++ - C++中的方法和成员有什么区别?

methods - 防止equals方法的 stub

java - 如何告诉我的代码在 Android 中检查哪些标签?

java - Android 文本输入总是给我 NaN 值

java - Android FirebaseRecyclerView 实现搜索用户功能时遇到的问题

Android Studio 中缺少调试信息的 Android 应用程序

java - 使用 Spring 3 在应用程序引擎中处理错误 (400)

c++ - 如何摆脱 Visual Studio 中的 "unsafe"警告/错误(strcpy、sprintf、strdup)

c++ - 如何将源代码附加到 Eclipse 中的预构建静态 C 库

python - 方法与属性哪个更快?