Как записать каждый метод времени, затрачиваемого на один интерфейс - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть интерфейс с тремя методами start()rollback() и retry(), и в интерфейсе может быть много орудий, предположим два FisrtImpl и SecondImpl, как записывать FisrtImpl и SecondImpl ' s start()rollback() и retry() стоимость времени?

Я нахожу вероятный вопрос Запись каждого выполнения метода , но ответ не тот, который я хочу.

1 Ответ

0 голосов
/ 23 апреля 2020

Напишите реализацию прокси, которая умножит методы.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...