user680406
user680406

Reputation: 5747

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

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

Something like

System.out.println(execution.time);

in the end of the code.

Upvotes: 4

Views: 13376

Answers (9)

RoflcoptrException
RoflcoptrException

Reputation: 52229

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

Upvotes: 8

Herke Jan
Herke Jan

Reputation: 1

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

Upvotes: 0

missingfaktor
missingfaktor

Reputation: 92046

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

Upvotes: 0

pingw33n
pingw33n

Reputation: 12510

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

Upvotes: 1

user85421
user85421

Reputation: 29680

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

Upvotes: 1

Denis R.
Denis R.

Reputation: 818

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

Upvotes: 1

Joachim Sauer
Joachim Sauer

Reputation: 308031

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.

Upvotes: 4

Justin Thomas
Justin Thomas

Reputation: 5848

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/

Upvotes: 2

Saurabh Gokhale
Saurabh Gokhale

Reputation: 46395

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

Upvotes: 2

Related Questions