Мне нужно измерить время, необходимое для завершения функции в Java. Как я могу это сделать?
Примечание:
Я хочу измерить потребление функции, а не полной программы.
Мне нужно измерить время, необходимое для завершения функции в Java. Как я могу это сделать?
Я хочу измерить потребление функции, а не полной программы.
long start = System.nanoTime();
methodToBeTimed();
long elapsedTime = System.nanoTime() - start;
Вот как можно вычислить прошедшее время.
// Get current time
long start = System.currentTimeMillis();
// Do something ...
// Get elapsed time in milliseconds
long elapsedTimeMillis = System.currentTimeMillis()-start;
// Get elapsed time in seconds
float elapsedTimeSec = elapsedTimeMillis/1000F;
// Get elapsed time in minutes
float elapsedTimeMin = elapsedTimeMillis/(60*1000F);
// Get elapsed time in hours
float elapsedTimeHour = elapsedTimeMillis/(60*60*1000F);
// Get elapsed time in days
float elapsedTimeDay = elapsedTimeMillis/(24*60*60*1000F);
Если вы используете Guava, рассмотрите использование Stopwatch
, например:
final Stopwatch sw = Stopwatch.createStarted();
methodToBeTimed();
final long elapsedMillis = sw.elapsed(TimeUnit.MILLISECONDS);
Профилировщик - это правильный ответ, если у вас есть несколько функций.
Еще одна проблема, которую я вижу со всеми предложениями, которые были даны до сих пор, заключается в том, что они отлично работают для одной функции, но ваш код будет усеян таймингами, которые вы не можете отключить.
Если вы знаете, как делать аспектно-ориентированное программирование, это хороший способ сохранить код синхронизации в одном месте и применить его декларативно. Если вы используете что-то вроде Log4J для вывода значений, вы можете отключить его или включить. Это плохой профайлер.
Посмотрите на AspectJ или Spring AOP.
Все фрагменты кода выше измеряют приблизительное время, прошедшее с момента вызова метода до момента, когда метод возвращает/выдает исключение. Такие методы не предназначены для планирования потоков, приостанавливаются из-за GC и т.д.
Да, некоторые профилировщики сделают разумную работу.
Если вы используете Java 1.6, вы можете использовать поддержку управления и мониторинга VM на основе JMX. Например, вы можете найти ThreadMXBean.getCurrentThreadCpuTime(). Вычисление разницы этого значения до и после вызова метода даст вам:
"... общее время процессора для текущего потока в наносекундах. Возвращаемое значение имеет точность наносекунд, но не обязательно точность наносекунд. Если в реализации различается время пользовательского режима и время системного режима, возвращаемое время CPU является количество времени, которое текущий поток выполнил в пользовательском режиме или в системном режиме".
Если ваш метод порождает рабочие потоки, то ваши вычисления должны быть более сложными; -)
В общем, я рекомендую использовать пакет java.lang.mangement.
Используйте либо System.currentTimeMillis(), либо System.nanoTime():
int someMethod() {
long tm = System.nanoTime();
try {
...
} finally {
tm = System.nanoTime()-tm;
System.out.println("time spent in someMethod(): " + tm + "ns");
}
}
System.nanoTime следует использовать для точного измерения дельта между двумя моментами для микрообъектов.
public class CountTime {
private static void walk() {
for (int i = 0; i < Integer.MAX_VALUE; i++)
;
}
public static void main(String[] args) {
long t0 = System.nanoTime();
walk();
long t1 = System.nanoTime();
System.out.println("Elapsed time =" + (t1 - t0)
+ " nanoseconds");
}
}
System.currentTimeMillis возвращает текущее время в миллисекундах. Вы можете использовать это, чтобы получить текущее время. Это может быть полезно для старых виртуальных машин или для более длительных процессов.
этот аналоговый секундомер - еще один вариант для нас тоже... Проверьте Java2s.com здесь.
Если вы хотите получить текущее время, используйте java.util.Date
.