it-swarm.com.ru

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

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

Замечания:

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

48
fmsf
long start = System.nanoTime();    
methodToBeTimed();
long elapsedTime = System.nanoTime() - start;
86
Ande TURNER

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

// 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);
42
Christian Stade-Schuldt

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

final Stopwatch sw = Stopwatch.createStarted();
methodToBeTimed();
final long elapsedMillis = sw.elapsed(TimeUnit.MILLISECONDS);
8
Jonathan
8
Aaron Maenpaa

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

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

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

Взгляните на AspectJ или Spring AOP.

6
duffymo

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

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

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

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

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

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

5
Dilum Ranatunga

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

3
McDowell

Используйте либо 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
Maurice Perry

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

0
gumuruh