Как я могу посчитать время, необходимое для завершения функции в Java? - PullRequest
49 голосов
/ 28 марта 2009

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

Примечание:

Я хочу измерить время * функции , а не полную программу.

Ответы [ 10 ]

87 голосов
/ 28 марта 2009
long start = System.nanoTime();    
methodToBeTimed();
long elapsedTime = System.nanoTime() - start;
43 голосов
/ 28 марта 2009

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

// 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);
8 голосов
/ 10 июня 2013

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

final Stopwatch sw = Stopwatch.createStarted();
methodToBeTimed();
final long elapsedMillis = sw.elapsed(TimeUnit.MILLISECONDS);
8 голосов
/ 28 марта 2009
6 голосов
/ 28 марта 2009

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

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

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

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

5 голосов
/ 28 марта 2009

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

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

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

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

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

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

3 голосов
/ 28 марта 2009

Используйте либо 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");
    }
}
3 голосов
/ 28 марта 2009

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

0 голосов
/ 21 августа 2011

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

0 голосов
/ 28 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...