2011-03-29 71 views

回答

7

这里是你如何能做到这一点一complete and little modified example

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

我会在构造函数中设置'start',这使得它更难以错误地使用类;-) – 2011-03-29 11:38:07

+0

好主意,我会更改代码。 – RoflcoptrException 2011-03-29 11:39:30

+1

我认为不需要重置方法。很好的例子。 – 2011-03-29 12:49:14

3

您可以轻松实施自己使用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()只能用于测量时间跨度,并且不能用于识别某个特定时间点。

+0

最好使用'System.nanoTime()'来测量经过时间。 – 2011-03-29 11:26:05

+1

@佩特:往往不是,差异不会引人注目。我回答的基础是执行时间有点长的假设(即多秒)。 – 2011-03-29 11:31:06

2

你可以运行一个分析器,或者使用两个电话的差异System.currentTimeMillis()

像这样:

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

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

如果你想对你测量的东西更多的细节,我强烈建议你使用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

1

使用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); 
    } 
} 
0

您可以设计一个控制抽象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 
0

我喜欢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"; 
    } 
}