Разделение бизнесс-логики и логики замера времени выполнения
Мне нужно замерить время выполнения определенных методов. Однако, замеры времени сильно захламляют логику и делают метод малочитаемым:
public void method() {
StopWatch sw = new StopWatch();
sw.start();
innerMethod1();
sw.stop();
Monitoring.add("eventType1", sw.getLastTaskTimeMillis());
sw.start();
innerMethod2("abs");
sw.stop();
Monitoring.add("eventType2", sw.getLastTaskTimeMillis());
sw.start();
innerMethod3(5, 29);
sw.stop();
Monitoring.add("eventType3", sw.getLastTaskTimeMillis());
}
Поскольку это приватные методы и вызываются они внутри класса, поэтому Spring AOP мне не подходит. AspectJ сильно меня смущает необходимостью использования дополнительных ключей согласно статье на habr. Есть ли какие-то другие способы разделить логику?
Ответы (1 шт):
Автор решения: Podushkoved
→ Ссылка
Можно отдельный метод создать для замеров времени, а на вход ему передавать объект Runnable с кодом, время выполнения которого нужно замерить:
private static void benchmark(String text, int iterations, Runnable runnable) {
long counter;
long avgCounter = 0;
System.out.print(text);
for (int i = 0; i < iterations; i++) {
counter = System.currentTimeMillis();
// Код, время выполнения
// которого будем замерять
runnable.run();
counter = System.currentTimeMillis() - counter;
System.out.print(" | " + counter);
avgCounter += counter;
// Вызываем garbage collector
System.gc();
}
System.out.println(" || " + avgCounter / iterations);
}
Пример вызова:
public static void main(String[] args) {
int iterations = 10;
benchmark("eventType1", iterations, () -> {
// do something
method1();
method2();
});
benchmark("eventType2", iterations, () -> {
// do something
method3();
method4();
});
// . . .
}
Вывод:
eventType1 | 109 | 109 | 108 | 108 | 108 | 108 | 109 | 108 | 109 | 108 || 108
eventType2 | 108 | 108 | 108 | 109 | 109 | 108 | 108 | 108 | 108 | 108 || 108
Примечание: код выполняется в текущем потоке. Многопоточность не используется.