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

58

我需要在Java中测量函数完成所需的时间。如何做到这一点?

注意:

我想要测量函数的时间消耗,而不是整个程序的时间。

10个回答

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

3
请注意,nanoTime调用的时钟可能不准确到纳秒。如果你幸运的话,精度可能是你的CPU时钟速度,否则可能是其倍数。 - Paul Tomblin
1
如果您需要以纳秒为单位计时函数,或许它已经足够快了?我之前一直很烦,需要将所有时间除以10亿才能得到秒数。 - Noumenon
我做了这个,精度比使用计时器更准确(在 methodToBeTimed() 方法之前启动计时器,方法执行完后立即停止计时器)。 - Ignacio Chiazzo

53

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

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

1
但这一个很有用,但也很难。 :D - gumuruh

10
如果您正在使用Guava,请考虑使用Stopwatch,例如:
final Stopwatch sw = Stopwatch.createStarted();
methodToBeTimed();
final long elapsedMillis = sw.elapsed(TimeUnit.MILLISECONDS);

9

有点过头了..不过我也想说同样的话 :-) - TofuBeer

6

如果您有多个函数需要处理,那么分析器是正确的选择。

到目前为止,我看到所有给出的建议都存在一个问题,那就是它们对单个函数的工作效果很好,但您的代码将充斥着定时相关内容,这些内容您无法关闭。

如果您知道如何进行面向切面编程,那么这是一种将计时代码保留在一个地方并声明性应用它的好方法。如果您使用像Log4J这样的东西来输出值,则可以选择打开或关闭它。这是一个贫民版的分析器。

请查看AspectJ或Spring的AOP。


我同意,如果你只想计时一个函数,那么分析器可能有些过头了;然而,即使你最初只想计时一个函数,你通常最终会计时更多的函数。 - Aaron Maenpaa

5
上述所有代码片段都测量了从调用该方法到方法返回/抛出异常所经过的大致时间。这种技术并未解决线程调度、由于GC而导致的暂停等问题。
是的,一些性能分析器会做出合理的工作。
如果您使用Java 1.6及以上版本,则可以使用基于JMX的VM管理和监控支持。例如,您可能会发现ThreadMXBean.getCurrentThreadCpuTime()很有价值。计算调用方法前后此值的差异将为您提供:
“...当前线程的总CPU时间(以纳秒为单位)。返回的值具有纳秒精度,但不一定具有纳秒准确性。如果实现区分用户模式时间和系统模式时间,则返回的CPU时间是当前线程在用户模式或系统模式下执行的时间。”
如果您的方法生成工作线程,则您的计算将需要更加复杂;-)

一般来说,我建议在java.lang.mangement包中浏览。


4

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 返回当前时间的毫秒数。您可以使用此方法获取当前时间。在旧的虚拟机或长时间运行的进程中,这可能很有用。


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

0

这个模拟秒表也是我们的另一个选择... 在Java2s.com这里检查。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接