Is there a command in java to measure the execution time?

爷,独闯天下 提交于 2020-01-13 11:23:07

问题


Is there a command in java to measure the execution time ?

Something like

System.out.println(execution.time);

in the end of the code.


回答1:


Here is a complete and little modified example on how you could do that:

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");
  }
}



回答2:


You can easily implement that yourself using System.currentTimeMillis():

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

Alternatively (especially if your task doesn't run as long), you might want to use System.nanoTime(). Note that contrary to how currentTimeMillis() works, the value returned by nanoTime() is not relative to some specified time. This means that nanoTime() can only be used to measure time spans and can't be used to identify some specifiy point in time.




回答3:


You could run a profiler, or use the difference of two calls to System.currentTimeMillis()

Like this :

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

System.out.println("Execution time was "+(end-start)+" ms.");



回答4:


Easiest way is to use System.currentTimeMillis() before and after the code executing. Joda-Time has more sophisticated versions of that: http://joda-time.sourceforge.net/




回答5:


If you want to have more details on what you measure, I strongly suggest you use JMX especially ThreadMXBean : http://download.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html

Code sample :

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

A quite complete explanation with code samples is available here : http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking




回答6:


Use the ThreadMXBean for more detailed timing:

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



回答7:


Apache Commons library has StopWatch class and Spring also has StopWatch.




回答8:


You can design a control abstraction time that takes as parameter an action to be performed and measures and prints the time required to execute it.

Code:

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



回答9:


I liked the class example of RoflcoptrException. I rewrote it to its essentials:

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";
  }
}


来源:https://stackoverflow.com/questions/5471700/is-there-a-command-in-java-to-measure-the-execution-time

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!