2010-07-06 3 views
6

Я хочу захватить время, чтобы перейти от оператора A к заявлению B в классе Java. В промежутках между этими заявлениями сделано много вызовов веб-сервисов. Я хотел знать, есть ли какая-то секундомерная функция, например, в java, которую я мог бы использовать, чтобы фиксировать точное время?Захват времени выполнения между двумя операторами Java?

Kaddy

+0

Вам нужно что-то более точное, чем миллисекунды? Если нет, System.currentTimeMillis() должен сделать - вызвать его в начале, вызвать его в конце и вычесть. –

+1

Я предлагаю прочитать [ответ Кевина о 'nanoTime()'] (http://stackoverflow.com/questions/1770010/how-do-i-measure-time-elapsed-in-java/1776053#1776053). –

ответ

12

Это даст вам количество наносекунд между двумя nanoTime() вызовов.

long start = System.nanoTime(); 
// Java statements 
long diff = System.nanoTime() - start; 

Для более сложных подходов существует несколько дублирующих вопросов, которые касаются Секундомер классов:

0

System.currentTimeMillis получите его в миллисекундах и nanoTime в наносекундах.

Если вы пытаетесь сравнить производительность различных технологий, обратите внимание на то, что среда JVM сложна, поэтому просто одно время не имеет смысла. Я всегда пишу цикл, где я выполняю метод 1 несколько тысяч раз, затем делаю System.gc, затем выполняю метод 2 несколько тысяч раз, затем делаю еще один System.gc, затем завершаю назад и делаю все это по крайней мере пять раз или шесть раз. Это помогает усреднить время сбора мусора, компиляции точно в срок и другие магические вещи, происходящие в JVM.

2

@ Ответ на вопрос Бена S на месте.

Однако, следует отметить, что подход вставляя заявления измерения времени в код не масштабируется:

  • Это делает ваш код выглядеть беспорядок.
  • Это заставляет ваше приложение работать медленнее. Те звонки в System.nanoTime() не приходят бесплатно!
  • Он вводит возможность ошибок.

Если ваша настоящая цель - попытаться понять, почему ваше приложение работает медленно, так что вы решаете, что для оптимизации, то лучшим решением является использование профилировщика Java. Это имеет то преимущество, что вам нужно внести изменения ZERO в исходный код. (Конечно, профилирование не дает вам точное время, проведенное в определенных разделах. Скорее, это дает вам временные пропорции ... что гораздо более полезно для решения, где оптимизировать.)

Смежные вопросы