Есть ли в Java команда для измерения времени выполнения? - PullRequest
4 голосов
/ 29 марта 2011

Есть ли в java команда для измерения времени выполнения?

Что-то вроде

System.out.println(execution.time);

в конце кода.

Ответы [ 9 ]

7 голосов
/ 29 марта 2011

Вот полный и немного измененный пример о том, как вы можете это сделать:

public class ExecutionTimer {
  private long start;
  private long end;

  public ExecutionTimer() {
    reset();
    start = System.currentTimeMillis();
  }

  public void end() {
    end = System.currentTimeMillis();
  }

  public long duration(){
    return (end-start);
  }

  public void reset() {
    start = 0;  
    end   = 0;
  }

  public static void main(String s[]) {
    // simple example
    ExecutionTimer t = new ExecutionTimer();
    for (int i = 0; i < 80; i++){
System.out.print(".");
}
    t.end();
    System.out.println("\n" + t.duration() + " ms");
  }
}
3 голосов
/ 29 марта 2011

Вы можете легко реализовать это самостоятельно, используя System.currentTimeMillis():

final long start = System.currentTimeMillis();
executeLongRunningTask();
final long durationInMilliseconds = System.currentTimeMillis()-start;
System.out.println("executeLongRunningTask() took " + durationInMilliseconds + "ms.");

В качестве альтернативы (особенно если ваша задача не выполняется так долго), вы можете использовать System.nanoTime(). Обратите внимание, что вопреки принципам работы currentTimeMillis(), значение, возвращаемое nanoTime(), равно , а не относительно некоторого указанного времени. Это означает, что nanoTime() может использоваться только для измерения промежутков времени и не может использоваться для определения определенного момента времени.

2 голосов
/ 29 марта 2011

Самый простой способ - использовать System.currentTimeMillis () до и после выполнения кода.У Joda-Time есть более сложные версии этого: http://joda -time.sourceforge.net /

2 голосов
/ 29 марта 2011

Вы можете запустить профилировщик или использовать разницу двух вызовов для System.currentTimeMillis()

Как это:

long start = System.currentTimeMillis();
....
doSomething();
....
long end = System.currentTimeMillis();

System.out.println("Execution time was "+(end-start)+" ms.");
1 голос
/ 29 марта 2011

Библиотека Apache Commons имеет класс StopWatch , а Spring также имеет StopWatch .

1 голос
/ 29 марта 2011

Используйте ThreadMXBean для более подробной синхронизации:

public class Timer {

  static { 
    // needed to request 1ms timer interrupt period 
    // http://discuss.joelonsoftware.com/default.asp?joel.3.642646.9
    Thread thread = new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          Thread.sleep(Integer.MAX_VALUE);  (Windows NT)
        } catch (InterruptedException ignored) {
        }
      }
    });
    thread.setName("Timer");
    thread.setDaemon(true);
    thread.start();
  }

  private final ThreadMXBean threadMX = ManagementFactory.getThreadMXBean();
  private final long elapsedStart;
  private final long cpuStart;
  private final long userStart;

  public Timer() {
    cpuStart = threadMX.getCurrentThreadCpuTime();
    userStart = threadMX.getCurrentThreadUserTime();
    elapsedStart = System.nanoTime();
  }

  public void times() {
    long elapsed = elapsedStart - System.nanoTime();
    long cpu = cpuStart - threadMX.getCurrentThreadCpuTime();
    long user = userStart - threadMX.getCurrentThreadUserTime();
    System.out.printf("elapsed=%-8.3f cpu=%-8.3f user=%-8.3f [seconds]", 
            elapsed/1.0e9, cpu/1.0e9, user/1.0e9);
  }
}
1 голос
/ 29 марта 2011

Если вы хотите получить более подробную информацию о ваших измерениях, я настоятельно рекомендую вам использовать JMX, особенно ThreadMXBean: http://download.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html

Пример кода:

ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
if (bean.isCurrentThreadCpuTimeSupported()) {
    long cpuTime = bean.getCurrentThreadCpuTime( );
}
long userTime = bean.getCurrentThreadUserTime( );

Довольно полное объяснение с примерами кода доступно здесь: http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking

0 голосов
/ 29 января 2015

Мне понравился пример класса RoflcoptrException.Я переписал его в его основы:

public class ExecutionTimer {
  private long start;

  public ExecutionTimer() {
    restart();
  }

  public void restart() {
    start = System.currentTimeMillis();
  }

  public long time(){
    long end = System.currentTimeMillis();
    return (end-start);
  }
  public String toString() {
     return "Time="+time()+" ms";
  }
}
0 голосов
/ 17 апреля 2011

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

Код:

interface Action<A> {
  public A perform();
}

class Timer {
  public static <A> A time(final String description, final Action<A> action) {
    final long start = System.nanoTime();
    final A result = action.perform();
    final long end = System.nanoTime();
    System.out.println(description + " - Time elapsed: " + (end - start) +"ns");
    return result;
  }
}

class Main {
  public static void main(final String[] args) {
    final int factorialOf5 = Timer.time("Calculating factorial of 5",
      new Action<Integer>() {
        public Integer perform() {
          int result = 1;
          for(int i = 2; i <= 5; i++) {
            result *= i;
          }
          return result;
        }
      }
    );
    System.out.println("Result: " + factorialOf5);
  }
}

// Output:
// Calculating factorial of 5 - Time elapsed: 782052ns
// Result: 120
...