В нашей реальной разработке мы столкнемся с трудоемкой ситуацией подсчета фрагмента кода более или менее.Наш общий метод написания выглядит следующим образом.
long start = System.currentTimeMillis();
try {
// .... 具体的代码段
} finally {
System.out.println("cost: " + (System.currentTimeMillis() - start));
}
В приведенном выше написании нет ничего плохого, но выглядит оно не очень красиво, так что есть ли более изящное письмо?
1. Агентский метод
Учащиеся, которые понимают Spring AOP, могут сразу же придумать решение.Если вы хотите подсчитать затраты времени на определенный метод, вы можете использовать аспект для достижения ненавязчивой реализации, например
// 定义切点,拦截所有满足条件的方法
@Pointcut("execution(public * com.git.hui.boot.aop.demo.*.*(*))")
public void point() {
}
@Around("point()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
try{
return joinPoint.proceed();
} finally {
System.out.println("cost: " + (System.currentTimeMillis() - start));
}
}
Основополагающим принципом поддержки Spring AOP является режим прокси, который предоставляет расширенные функции для целевого объекта; в экосистеме Spring использование методов aop для подсчета занимает много времени, что можно назвать менее навязчивым и простым в реализации, но есть следующие проблемы
- Статистическая детализация на уровне метода
- Вызов метода внутри класса не может вступить в силу (подробности см. в сообщении блога:[Учебник SpringBoot Basic Series] Расширенные навыки АОП)
2. AutoCloseable
Новый интерфейс был представлен в JDK1.7.AutoCloseable
, обычно его класс реализации соответствуетtry{}
Использование, вы часто можете увидеть следующую запись в использовании потоков ввода-вывода
// 读取文件内容并输出
try (Reader stream = new BufferedReader(new InputStreamReader(new FileInputStream("/tmp")))) {
List<String> list = ((BufferedReader) stream).lines().collect(Collectors.toList());
System.out.println(list);
} catch (IOException e) {
e.printStackTrace();
}
Обратите внимание, что в приведенном выше письме наиболее примечательным моментом является то, что нет необходимости активно писатьstream.close
, основная причина в том, чтоtry(){}
После выполнения метод будет вызванAutoCloseable#close
метод;
Исходя из этого, у нас будет идея большого заказа, следующаяCost
реализация классаAutoCloseable
Интерфейс, запишите время при его создании, запишите время в методе закрытия и выведите разницу во времени; поместите логику, которая должна подсчитывать время, отнимающееtry(){}
кодовый блок
Вот конкретная реализация:
public static class Cost implements AutoCloseable {
private long start;
public Cost() {
this.start = System.currentTimeMillis();
}
@Override
public void close() {
System.out.println("cost: " + (System.currentTimeMillis() - start));
}
}
public static void testPrint() {
for (int i = 0; i < 5; i++) {
System.out.println("now " + i);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try (Cost c = new Cost()) {
testPrint();
}
System.out.println("------over-------");
}
Вывод после выполнения следующий:
now 0
now 1
now 2
now 3
now 4
cost: 55
------over-------
Если блок кода выдает исключение, потребуется ли время для нормального вывода?
public static void testPrint() {
for (int i = 0; i < 5; i++) {
System.out.println("now " + i);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (i == 3) {
throw new RuntimeException("some exception!");
}
}
}
Вывод снова выглядит следующим образом, и проблем нет
now 0
now 1
now 2
now 3
cost: 46
Exception in thread "main" java.lang.RuntimeException: some exception!
at com.git.hui.boot.order.Application.testPrint(Application.java:43)
at com.git.hui.boot.order.Application.main(Application.java:50)
3. Резюме
Помимо двух описанных выше способов, есть еще один способ, не слишком распространенный в бизнес-разработке, но его можно увидеть в функциональных компонентах промежуточного ПО и базовых сервисов, реализуемый с помощью технологии зондирования Java Agent, например, Артас Али есть в На базе JavaAgent сделаны различные функции бога, которые будут специально внедрены при внедрении технологии java probe в будущем.
Ниже приводится сводка трех методов статистического учета затрат времени.
Основное написание
long start = System.currentTimeMillis();
try {
// .... 具体的代码段
} finally {
System.out.println("cost: " + (System.currentTimeMillis() - start));
}
Преимущество в том, что он прост и имеет широкий спектр применения; недостаток в том, что он навязчив и содержит много повторяющегося кода.
Spring AOP
В экосистеме Spring АОП можно использовать для перехвата целевых методов, а статистика отнимает много времени.
@Around("...")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
try{
return joinPoint.proceed();
} finally {
System.out.println("cost: " + (System.currentTimeMillis() - start));
}
}
Преимущества: отсутствие вмешательства, подходит для унифицированного управления (например, тестовая среда требует много времени для вывода статистики, а производственная среда не выводит); уровень метода, который ограничен областью использования АОП
AutoCloseable
Этот метод можно рассматривать как усовершенствованную версию первого метода письма.
// 定义类
public static class Cost implements AutoCloseable {
private long start;
public Cost() {
this.start = System.currentTimeMillis();
}
@Override
public void close() {
System.out.println("cost: " + (System.currentTimeMillis() - start));
}
}
// 使用姿势
try (Cost c = new Cost()) {
...
}
Преимущества: простота, широкое применение и пригодность для унифицированного управления; недостаток в том, что вторжение в код по-прежнему возможно.
инструкция
Второй метод, описанный выше, кажется наиболее элегантным, но он сильно ограничивает; если есть необходимость в большей гибкости, рекомендуется рассмотреть третий метод, который намного более элегантен с точки зрения простоты кода и унифицированного управления. по сравнению с первым методом можно уменьшить много избыточного кода
II. Другое
1. серый блог:liuyueyi.github.io/hexblog
Серый личный блог, записывающий все посты блога по учебе и работе, приглашаю всех в гости
2. Заявление
Это не так хорошо, как письмо веры.Контент уже был размещен, и это чисто из семьи.Из-за ограниченных личных возможностей неизбежно будут упущения и ошибки.Если вы найдете ошибки или лучше предложения, вы можете критиковать и исправлять их.
- Адрес вейбо:Блог Маленького Серого
- QQ: серо-серый / 3302797840
3. Сканируйте внимание
серый блог