我如何计算一个函数在Java中完成的时间?

我需要测量一个函数在Java中完成所花费的时间。 我怎样才能做到这一点?

注意:

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

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

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

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

使用一个 分析器 。

如果您正在使用番石榴,请考虑使用Stopwatch ,例如:

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

如果您有多个function,则分析器是正确的答案。

另一个问题,我看到所有的build议,迄今给出的是,他们工作正常的单一function,但你的代码将乱七八糟的计时东西,你不能closures。

如果您知道如何进行面向方面编程,那么将时间代码保存在一个地方并以声明方式应用是一种好方法。 如果您使用类似Log4J的输出值,您可以selectclosures或打开。 这是一个穷人的分析器。

看看AspectJ或Spring的AOP。

上面的所有代码片段都是度量从方法被调用时到方法返回/抛出exception的大致时间。 这种技术不涉及线程调度,由于GC等原因而暂停

是的,一些分析师会做一个合理的工作。

如果您使用的是Java 1.6,则可以使用基于JMX的VMpipe理和监视支持。 例如,您可能会发现ThreadMXBean.getCurrentThreadCpuTime()的值。 计算方法调用之前和之后的这个值的差异会给你:

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

如果你的方法产生工作线程,那么你的计算将需要得到更精细的;-)

一般来说,我build议围绕java.lang.mangement包进行唠叨。

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

应该使用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或较长时间运行的进程有用。

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

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