我如何计算一个函数在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
。