Как мне рассчитать время выполнения метода в Java?

Самый чистый способ - написать свою собственную агрегатную функцию, чтобы сделать это, поскольку он будет обрабатывать это наиболее чисто (обрабатывает подсезонное разрешение и т. д.).

На самом деле, этот вопрос был задан (и ответил) на asktom.oracle.com a назад (статья содержит исходный код).

766
задан Eric Leschinski 26 April 2015 в 01:39
поделиться

12 ответов

Всегда существует старомодный путь:

long startTime = System.nanoTime();
methodToTime();
long endTime = System.nanoTime();

long duration = (endTime - startTime);  //divide by 1000000 to get milliseconds.
1105
ответ дан michaelsnowden 26 April 2015 в 01:39
поделиться

Как "skaffman" сказал, используйте AOP, ИЛИ можно использовать переплетение байт-кода времени выполнения, точно так же, как инструменты покрытия метода модульного теста используют для прозрачного добавления информации о синхронизации к вызванным методам.

можно посмотреть на код, используемый инструментами инструментов с открытым исходным кодом как Emma ( http://downloads.sourceforge.net/emma/emma-2.0.5312-src.zip?modtime=1118607545&big_mirror=0 ). Другой инструмент покрытия с открытым исходным кодом http://prdownloads.sourceforge.net/cobertura/cobertura-1.9-src.zip?download .

, Если Вам в конечном счете удается сделать то, что Вы излагаете в. совместно используйте его назад с сообществом здесь с Вашей задачей Ant / банки.

4
ответ дан anjanb 26 April 2015 в 01:39
поделиться
long startTime = System.currentTimeMillis();
// code goes here
long finishTime = System.currentTimeMillis();
long elapsedTime = finishTime - startTime; // elapsed time in milliseconds
3
ответ дан Ryan Rodemoyer 26 April 2015 в 01:39
поделиться

Если Вы хотите тактовое стеной время

long start_time = System.currentTimeMillis();
object.method();
long end_time = System.currentTimeMillis();
long execution_time = end_time - start_time;
4
ответ дан David Nehme 26 April 2015 в 01:39
поделиться

Используйте профилировщика (JProfiler, Профилировщик Netbeans, Визуальный VM, Профилировщик Eclipse, и т.д.). Вы получите самые точные результаты и наименее навязчивы. Они используют встроенный механизм JVM для профилирования, которое может также дать Вам дополнительную информацию как отслеживания стека, пути выполнения и более всесторонние результаты при необходимости.

При использовании полностью интегрированного профилировщика, это умирающим образом тривиально для профилирования метода. Щелкните правой кнопкой, Профилировщик-> Добавляют к Корневым Методам. Тогда выполните профилировщика точно так же, как Вы делали тестовый прогон или отладчик.

84
ответ дан James Schek 26 April 2015 в 01:39
поделиться

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

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

Редактирование: Вот ссылка к AOP Spring для запущения Вас, если Вы увлечены. Это - самая доступная реализация AOP, с которым Iive сталкиваются для Java.

кроме того, учитывая всех очень простые предложения else, я должен добавить, что AOP для того, когда Вы не хотите, чтобы материал как синхронизация вторгся в Ваш код. Но во многих случаях, такой простой и легкий подход прекрасен.

36
ответ дан Buhake Sindi 26 April 2015 в 01:39
поделиться

Существует несколько способов сделать это. Я обычно отступаю только к использованию чего-то вроде этого:

long start = System.currentTimeMillis();
// ... do something ...
long end = System.currentTimeMillis();

или то же самое с System.nanoTime ();

Для чего-то больше на стороне сравнительного тестирования вещей, кажется, также существует этот: http://jetm.void.fm/ Никогда не пробовал его все же.

5
ответ дан Horst Gutmann 26 April 2015 в 01:39
поделиться

Мы используем AspectJ и аннотации Java с этой целью. Если мы должны знать ко времени выполнения для метода, мы простой аннотируем его. Больше усовершенствованной версии могло использовать собственный уровень журнала, который может, включил и отключил во времени выполнения.

public @interface Trace {
  boolean showParameters();
}

@Aspect
public class TraceAspect {
  [...]
  @Around("tracePointcut() && @annotation(trace) && !within(TraceAspect)")
  public Object traceAdvice ( ProceedingJintPoint jP, Trace trace ) {

    Object result;
    // initilize timer

    try { 
      result = jp.procced();
    } finally { 
      // calculate execution time 
    }

    return result;
  }
  [...]
}
12
ответ дан 26 April 2015 в 01:39
поделиться

Просто маленькое скручивание, если Вы не используете инструменты и хотите к методам времени с низким временем выполнения: выполняйте его много раз, каждый раз удваивая количество раз, это выполняется, пока Вы не достигаете секунды, или около этого. Таким образом время Вызова к System.nanoTime и т.д, ни точность System.nanoTime действительно влияют на результат очень.

    int runs = 0, runsPerRound = 10;
    long begin = System.nanoTime(), end;
    do {
        for (int i=0; i<runsPerRound; ++i) timedMethod();
        end = System.nanoTime();
        runs += runsPerRound;
        runsPerRound *= 2;
    } while (runs < Integer.MAX_VALUE / 2 && 1000000000L > end - begin);
    System.out.println("Time for timedMethod() is " + 
        0.000000001 * (end-begin) / runs + " seconds");

, Конечно, протесты об использовании настенных часов применяются: влияния JIT-компиляции, несколько потоков / обрабатывают и т.д. Таким образом, необходимо сначала выполнить метод много из времен сначала, такой, что JIT-компилятор делает свою работу, и затем повторяет этот тест многократно и занимает самое низкое время выполнения.

14
ответ дан Hans-Peter Störr 26 April 2015 в 01:39
поделиться

Я в основном делаю изменения этого, но рассматривающий, как компиляция горячей точки работает, если Вы хотите получить точные результаты, необходимо вывести первые несколько измерений и удостовериться, что Вы используете метод в реальном мире (читайте специализированный), приложение.

, Если JIT решает скомпилировать его, Ваши числа будут варьироваться в большой степени. поэтому просто будьте знающие

6
ответ дан luke 26 April 2015 в 01:39
поделиться

Я иду с простым ответом. Работы для меня.

long startTime = System.currentTimeMillis();

doReallyLongThing();

long endTime = System.currentTimeMillis();

System.out.println("That took " + (endTime - startTime) + " milliseconds");

Это работает вполне хорошо. Разрешение очевидно только к миллисекунде, можно добиться большего успеха с System.nanoTime (). Существуют некоторые ограничения обоим (части расписания операционной системы, и т.д.), но это работает вполне прилично.

Среднее число через несколько выполнений (больше лучше) и Вы получите достойную идею.

176
ответ дан MBCook 26 April 2015 в 01:39
поделиться

Для java 8 +, другое возможное решение (более общий, func-стиль и без аспектов) могло состоять в том, чтобы создать некоторый код принятия служебного метода в качестве параметра

public static <T> T timed (String description, Consumer<String> out, Supplier<T> code) {
    final LocalDateTime start = LocalDateTime.now ();
    T res = code.get ();
    final long execTime = Duration.between (start, LocalDateTime.now ()).toMillis ();
    out.accept (String.format ("%s: %d ms", description, execTime));
    return res;
}

, И код вызова мог быть чем-то как этот:

public static void main (String[] args) throws InterruptedException {
    timed ("Simple example", System.out::println, Timing::myCode);
}

public static Object myCode () {
    try {
        Thread.sleep (1500);
    } catch (InterruptedException e) {
        e.printStackTrace ();
    }
    return null;
}
0
ответ дан Aska Fed 4 October 2019 в 08:32
поделиться
  • 1
    Этим методом, заголовок с возможностью прокрутки также, так там способ зафиксировать заголовок таблицы? – Kyleinincubator 14 May 2013 в 14:22
Другие вопросы по тегам:

Похожие вопросы: