我有一个包含三个方法start()
、rollback()
和retry()
的接口(interface),并且该接口(interface)可能有很多实现假设有两个FisrtImpl
和SecondImpl
,如何记录FisrtImpl
和SecondImpl
的start()
、 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/