简体   繁体   English

java中是否有命令来测量执行时间?

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

Is there a command in java to measure the execution time ? java中是否有命令来测量执行时间?

Something like 就像是

System.out.println(execution.time);

in the end of the code. 在代码的最后。

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

You can easily implement that yourself using System.currentTimeMillis() : 您可以使用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() . 或者(特别是如果您的任务运行时间不长),您可能希望使用System.nanoTime() Note that contrary to how currentTimeMillis() works, the value returned by nanoTime() is not relative to some specified time. 请注意,与currentTimeMillis()工作方式相反, nanoTime()返回的值与某个指定时间无关 This means that nanoTime() can only be used to measure time spans and can't be used to identify some specifiy point in time. 这意味着nanoTime()只能用于测量时间跨度 ,不能用于识别某些特定时间点。

You could run a profiler, or use the difference of two calls to System.currentTimeMillis() 您可以运行分析器,或使用两次调用System.currentTimeMillis()的差异

Like this : 像这样 :

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

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

Easiest way is to use System.currentTimeMillis() before and after the code executing. 最简单的方法是在代码执行之前和之后使用System.currentTimeMillis()。 Joda-Time has more sophisticated versions of that: http://joda-time.sourceforge.net/ Joda-Time有更复杂的版本: http//joda-time.sourceforge.net/

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 如果你想了解你测量的更多细节,我强烈建议你使用JMX特别是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 有关代码示例的完整说明,请访问: http//nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking

Use the ThreadMXBean for more detailed timing: 使用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);
  }
}

Apache Commons库有StopWatch类,Spring也有StopWatch

I liked the class example of RoflcoptrException. 我喜欢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";
  }
}

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. 您可以设计一个控件抽象time ,该控件抽象time将参数作为要执行的操作,并测量并打印执行它所需的时间。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM