如何计算在Java中完成函数所需的时间?

时间:2009-03-28 10:35:15

标签: java profiling

我需要测量函数在Java中完成所需的时间。我怎么能这样做?

注意:

我想测量功能的时间消耗,而不是完整程序的时间消耗。

10 个答案:

答案 0 :(得分:87)

long start = System.nanoTime();    
methodToBeTimed();
long elapsedTime = System.nanoTime() - start;

答案 1 :(得分:43)

以下是如何计算经过的时间。

// Get current time
long start = System.currentTimeMillis();

// Do something ...

// Get elapsed time in milliseconds
long elapsedTimeMillis = System.currentTimeMillis()-start;

// Get elapsed time in seconds
float elapsedTimeSec = elapsedTimeMillis/1000F;

// Get elapsed time in minutes
float elapsedTimeMin = elapsedTimeMillis/(60*1000F);

// Get elapsed time in hours
float elapsedTimeHour = elapsedTimeMillis/(60*60*1000F);

// Get elapsed time in days
float elapsedTimeDay = elapsedTimeMillis/(24*60*60*1000F);

答案 2 :(得分:8)

答案 3 :(得分:8)

如果您使用的是番石榴,请考虑使用Stopwatch,例如:

final Stopwatch sw = Stopwatch.createStarted();
methodToBeTimed();
final long elapsedMillis = sw.elapsed(TimeUnit.MILLISECONDS);

答案 4 :(得分:6)

如果您有多个功能,则探查器是正确的答案。

到目前为止,我看到的所有建议中的另一个问题是,它们可以在单个函数中正常工作,但是您的代码将会出现无法关闭的计时内容。

如果您知道如何进行面向方面编程,那么将时序代码保存在一个地方并以声明方式应用它是一种很好的方法。如果您使用Log4J之类的东西输出值,您可以选择将其关闭或打开。这是一个穷人的探究者。

看看AspectJ或Spring的AOP。

答案 5 :(得分:5)

上面的所有代码片段都衡量从调用方法到方法返回/抛出异常的时间过去的大致时间。这些技术不涉及线程调度,GC导致的暂停等等。

是的,有些个人会做一个合理的工作。

如果您使用的是Java 1.6,则可以使用基于JMX的VM管理和监视支持。例如,您可能会发现ThreadMXBean.getCurrentThreadCpuTime()的值。在方法调用之前和之后计算此值的差异将为您提供:

  

“......当前线程的总CPU时间,以纳秒为单位。返回值为纳秒级精度,但不一定是纳秒精度。如果实现区分用户模式时间和系统模式时间,则返回的CPU时间为当前线程在用户模式或系统模式下执行的时间量。“

如果你的方法产生了工作线程,那么你的计算需要更加复杂; - )

一般情况下,我建议围绕java.lang.mangement软件包。

答案 6 :(得分:3)

System.nanoTime应该用于精确测量微基准测试两次之间的差值。

public class CountTime {

  private static void walk() {
    for (int i = 0; i < Integer.MAX_VALUE; i++)
      ;
  }

  public static void main(String[] args) {
    long t0 = System.nanoTime();
    walk();
    long t1 = System.nanoTime();
    System.out.println("Elapsed time =" + (t1 - t0)
        + " nanoseconds");
  }

}

System.currentTimeMillis以毫秒为单位返回当前时间。您可以使用它来获取当前时间。这对于较旧的VM或较长时间运行的进程可能很有用。

答案 7 :(得分:3)

使用System.currentTimeMillis()或System.nanoTime():

int someMethod() {
    long tm = System.nanoTime();
    try {
        ...
    } finally {
        tm = System.nanoTime()-tm;
        System.out.println("time spent in someMethod(): " + tm + "ns");
    }
}

答案 8 :(得分:0)

这款模拟秒表也是我们的另一种选择...... 查看Java2s.com here.

答案 9 :(得分:-3)

如果您想获得当前时间,请使用java.util.Date