我需要测量一个函数在Java中完成所需的时间.我怎样才能做到这一点?
我想测量函数的时间消耗,而不是整个程序的消耗.
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);
如果您有多个功能,则探查器是正确的答案.
到目前为止,我看到的所有建议中的另一个问题是,它们可以在单个函数中正常工作,但是您的代码将会出现无法关闭的计时内容.
如果您知道如何进行面向方面编程,那么将时序代码保存在一个位置并以声明方式应用它是一种很好的方法.如果您使用Log4J之类的东西输出值,您可以选择将其关闭或打开.这是一个穷人的探究者.
看看AspectJ或Spring的AOP.
上面的所有代码片段都测量从调用方法到方法返回/抛出异常的时间过去的大致时间.这些技术不涉及线程调度,GC引起的暂停等.
是的,一些剖析器会做一个合理的工作.
如果您使用的是Java 1.6,则可以使用基于JMX的VM管理和监视支持.例如,您可能会找到值为ThreadMXBean.getCurrentThreadCpuTime()的值.在方法调用之前和之后计算此值的差异将为您提供:
"...当前线程的总CPU时间以纳秒为单位.返回值为纳秒精度但不一定是纳秒精度.如果实现区分用户模式时间和系统模式时间,则返回的CPU时间是时间量当前线程已在用户模式或系统模式下执行."
如果你的方法产生了工作线程,那么你的计算将需要更加精细;-)
一般来说,我建议围绕java.lang.mangement包.