Подтвердить что ты не робот

Как я могу подсчитать время, которое требуется для выполнения функции на Java?

Мне нужно измерить время, необходимое для завершения функции в Java. Как я могу это сделать?

Примечание:

Я хочу измерить потребление функции, а не полной программы.

4b9b3361

Ответ 1

long start = System.nanoTime();    
methodToBeTimed();
long elapsedTime = System.nanoTime() - start;

Ответ 2

Вот как можно вычислить прошедшее время.

// 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);

Ответ 4

Если вы используете Guava, рассмотрите использование Stopwatch, например:

final Stopwatch sw = Stopwatch.createStarted();
methodToBeTimed();
final long elapsedMillis = sw.elapsed(TimeUnit.MILLISECONDS);

Ответ 5

Профилировщик - это правильный ответ, если у вас есть несколько функций.

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

Если вы знаете, как делать аспектно-ориентированное программирование, это хороший способ сохранить код синхронизации в одном месте и применить его декларативно. Если вы используете что-то вроде Log4J для вывода значений, вы можете отключить его или включить. Это плохой профайлер.

Посмотрите на AspectJ или Spring AOP.

Ответ 6

Все фрагменты кода выше измеряют приблизительное время, прошедшее с момента вызова метода до момента, когда метод возвращает/выдает исключение. Такие методы не предназначены для планирования потоков, приостанавливаются из-за GC и т.д.

Да, некоторые профилировщики сделают разумную работу.

Если вы используете Java 1.6, вы можете использовать поддержку управления и мониторинга VM на основе JMX. Например, вы можете найти ThreadMXBean.getCurrentThreadCpuTime(). Вычисление разницы этого значения до и после вызова метода даст вам:

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

Если ваш метод порождает рабочие потоки, то ваши вычисления должны быть более сложными; -)

В общем, я рекомендую использовать пакет java.lang.mangement.

Ответ 7

Используйте либо 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");
    }
}

Ответ 8

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 возвращает текущее время в миллисекундах. Вы можете использовать это, чтобы получить текущее время. Это может быть полезно для старых виртуальных машин или для более длительных процессов.

Ответ 9

этот аналоговый секундомер - еще один вариант для нас тоже... Проверьте Java2s.com здесь.

Ответ 10

Если вы хотите получить текущее время, используйте java.util.Date.