Измерьте время выполнения для Java-метода

Как рассчитать время, затраченное на выполнение метода в Java?

Вы можете делать снимки временной метки до и после, а затем повторять эксперименты несколько раз, чтобы усреднить результаты . Есть также профилировщики, которые могут сделать это за вас.


Из книги «Производительность платформы Java: страtagsи и тактика»:

С System.currentTimeMillis ()

class TimeTest1 { public static void main(String[] args) { long startTime = System.currentTimeMillis(); long total = 0; for (int i = 0; i < 10000000; i++) { total += i; } long stopTime = System.currentTimeMillis(); long elapsedTime = stopTime - startTime; System.out.println(elapsedTime); } } 

С classом StopWatch

Вы можете использовать этот class StopWatch и вызвать start() и stop до и после метода.

 class TimeTest2 { public static void main(String[] args) { Stopwatch timer = new Stopwatch().start(); long total = 0; for (int i = 0; i < 10000000; i++) { total += i; } timer.stop(); System.out.println(timer.getElapsedTime()); } } 

См. Здесь .


Профиль пользователя NetBeans:

Применение приложения

Производительность профилей производительности процессора на уровне метода (время выполнения) . Вы можете настроить профилирование всего приложения или части приложения.

См. Здесь .

Чтобы быть более точным, я бы использовал nanoTime() а не currentTimeMillis() :

 long startTime = System.nanoTime(); myCall(); long stopTime = System.nanoTime(); System.out.println(stopTime - startTime); 

В Java 8 (выходной формат ISO-8601):

 Instant start = Instant.now(); Thread.sleep(63553); Instant end = Instant.now(); System.out.println(Duration.between(start, end)); // prints PT1M3.553S 

Guava Секундомер :

 Stopwatch stopwatch = Stopwatch.createStarted(); myCall(); stopwatch.stop(); // optional System.out.println("Time elapsed for myCall() is "+ stopwatch.elapsed(MILLISECONDS)); 

Проверьте это: System.currentTimeMillis .

С помощью этого вы можете рассчитать время своего метода, выполнив:

 long start = System.currentTimeMillis(); class.method(); long time = System.currentTimeMillis() - start; 

Если вы разрабатываете приложения для Android, вы должны попробовать class TimingLogger .
Взгляните на эти статьи, описывающие использование вспомогательного classа TimingLogger :

  • Измерение производительности в Android SDK (27.09.2010)
  • Открытие Android API – часть 1 (03.01.2017)

Возможно, вам стоит подумать об аспектно-ориентированном программировании. Вы не хотите засорять свой код таймингами. Вы хотите, чтобы их можно было отключить и декларативно.

Если вы используете Spring, взгляните на их class MethodInterceptor .

Если вы в настоящее время пишете приложение, то ответ на использование System.currentTimeMillis или System.nanoTime служит цели, указанной выше.

Но если вы уже написали код и не хотите его менять, лучше использовать перехватчики метода Spring. Так, например, ваш сервис:

 public class MyService { public void doSomething() { for (int i = 1; i < 10000; i++) { System.out.println("i=" + i); } } } 

Чтобы избежать изменения службы, вы можете написать свой собственный метод перехватчика:

 public class ServiceMethodInterceptor implements MethodInterceptor { public Object invoke(MethodInvocation methodInvocation) throws Throwable { long startTime = System.currentTimeMillis(); Object result = methodInvocation.proceed(); long duration = System.currentTimeMillis() - startTime; Method method = methodInvocation.getMethod(); String methodName = method.getDeclaringClass().getName() + "." + method.getName(); System.out.println("Method '" + methodName + "' took " + duration + " milliseconds to run"); return null; } } 

Также доступны Java API с открытым исходным кодом, например, BTrace . или профилировщиком Netbeans, как было предложено выше @bakkal и @Saikikos. Благодарю.

Поскольку предложенный nanoTime () очень точен на коротких временных масштабах. Когда требуется эта точность, вам нужно позаботиться о том, что вы действительно измеряете. Специально не для измерения самого вызова нанотима

 long start1 = System.nanoTime(); // maybe add here a call to a return to remove call up time, too. // Avoid optimization long start2 = System.nanoTime(); myCall(); long stop = System.nanoTime(); long diff = stop - 2*start2 + start1; System.out.println(diff + " ns"); 

Кстати, вы будете измерять разные значения для одного и того же вызова из-за

  • другая нагрузка на ваш компьютер (фон, сеть, движение мыши, прерывания, переключение задач, streamи)
  • заполнение кеша (холодное, теплое)
  • jit-компиляция (без оптимизации, производительности, вызванной запуском компилятора, повышение производительности из-за компилятора (но иногда код с jit медленнее, чем без!))

Нанотиме на самом деле не очень полезно в течение прошедшего времени, потому что оно значительно отличается от текущегоTimeMillis. Кроме того, nanotime имеет тенденцию обеспечивать чрезмерную точность за счет точности. Поэтому он крайне несовместим и нуждается в уточнении.

Для любого процесса измерения времени currentTimeMillis (хотя и почти так же плохо) делает лучше с точки зрения точности и точности балансировки.

  • как разобрать JSONArray в android
  • Android: ClickableSpan в интерактивном TextView
  • Android ListView заголовки
  • как я могу получить случайную базу данных Firebase
  • Android: подскажите пользователю сохранить изменения при нажатии кнопки «Назад»
  • Параллельная модификация Исключение: добавление в ArrayList
  • Как передать функцию в качестве параметра в Java?
  • Android-java- Как отсортировать список объектов по определенному значению внутри объекта
  • Перезапустите службу, даже если приложение отключено и продолжает работать в фоновом режиме даже после закрытия приложения How?
  • Использование AsyncTask с передачей значения
  • Каталог установки JRE в Windows
  • Давайте будем гением компьютера.