如何计算Java程序的执行速度

对不起,如果这听起来像一个愚蠢的问题,但你如何计时的Java程序的执行? 我不确定我应该用什么课程来做到这一点。

我有点像找:

//Some timer starts here for (int i = 0; i < length; i++) { // Do something } //End timer here System.out.println("Total execution time: " + totalExecutionTime); 

谢谢

 final long startTime = System.currentTimeMillis(); for (int i = 0; i < length; i++) { // Do something } final long endTime = System.currentTimeMillis(); System.out.println("Total execution time: " + (endTime - startTime) ); 

希望这有助于。

请注意,在多核CPU上无法可靠地使用System#nanoTime()来logging所用时间…每个核心都有自己的TSC( 时间戳计数器 ):该计数器用于获取纳米时间(实际上是从CPU启动以来的滴答数)。

因此,除非操作系统执行一些TSC时间扭曲来保持内核同步,否则如果一个线程在初始时间读取时在一个内核上被调度,则切换到不同的内核,相对时间可能偶尔出现向后跳转并转发。

我之前在AMD / Solaris上观察过这种情况,两个时间点之间的时间间隔有时会以负值或意外的大正数回来。 有一个Solaris内核补丁和一个BIOS设置需要强制AMD PowerNow! closures,似乎解决了它。

此外,在VirtualBox环境中使用Java System#nanoTime()时,(AFAIK)是一个迄今为止未定义的错误; 导致java.util.concurrency包依赖于nano时间的各种奇怪的间歇性线程问题。

也可以看看:

是System.nanoTime()完全无用? http://vbox.innotek.de/pipermail/vbox-trac/2010-January/135631.html

你可以使用System#nanoTime() 。 在执行之前和之后得到它,只是做math。 这是System#currentTimeMillis()之上的首选,因为它具有更好的精度。 根据所使用的硬件和平台,您可能会在经过的时间中得到不正确的差距。 这里用Windows上的Core2Duo,大概在0到15ms之间实际上什么都不能计算。

更高级的工具是分析器 。

你得到当前的系统时间,以毫秒为单位:

 final long startTime = System.currentTimeMillis(); 

然后你做你要做的事情:

 for (int i = 0; i < length; i++) { // Do something } 

那么你看看花了多长时间:

 final long elapsedTimeMillis = System.currentTimeMillis() - startTime; 

对于简单的东西, System.currentTimeMillis()可以工作。

这实际上是很常见的,我的IDE是安装的,所以一旦进入“t0”它会产生以下线路:

 final long t0 = System.currentTimeMillis() 

但对于更复杂的事情,你可能会想要使用统计时间测量,就像这里(向下滚动一下,看看expression的时间,包括标准差等):

http://perf4j.codehaus.org/devguide.html

使用jcabi方面的 AOP / AspectJ和@Loggable注释,您可以轻松简便地完成:

 @Loggable(Loggable.DEBUG) public String getSomeResult() { // return some value } 

每个调用这个方法都会被发送到SLF4J日志logging工具,并且具有DEBUG日志级别。 每条日志消息都会包含执行时间。

看看System.currentTimeMillis()

在循环的顶部使用long startTime=System.currentTimeMillis()作为开始时间

put long endTime= System.currentTimeMillis(); 循环结束之外。 您必须减去这些值才能以毫秒为单位获得运行时间。

如果你想要纳秒的时间,看看System.nanoTime()

你也可以尝试Perf4J。 它是一种干净利落的工作方式,有助于在一定的时间范围内汇总性能统计数据,如平均值,最小值,最大值,标准差和每秒事务数。 来自http://perf4j.codehaus.org/devguide.html的摘录:;

 StopWatch stopWatch = new LoggingStopWatch(); try { // the code block being timed - this is just a dummy example long sleepTime = (long)(Math.random() * 1000L); Thread.sleep(sleepTime); if (sleepTime > 500L) { throw new Exception("Throwing exception"); } stopWatch.stop("codeBlock2.success", "Sleep time was < 500 ms"); } catch (Exception e) { stopWatch.stop("codeBlock2.failure", "Exception was: " + e); } 

输出:

 INFO: start[1230493236109] time[447] tag[codeBlock2.success] message[Sleep time was < 500 ms] INFO: start[1230493236719] time[567] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception] INFO: start[1230493237286] time[986] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception] INFO: start[1230493238273] time[194] tag[codeBlock2.success] message[Sleep time was < 500 ms] INFO: start[1230493238467] time[463] tag[codeBlock2.success] message[Sleep time was < 500 ms] INFO: start[1230493238930] time[310] tag[codeBlock2.success] message[Sleep time was < 500 ms] INFO: start[1230493239241] time[610] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception] INFO: start[1230493239852] time[84] tag[codeBlock2.success] message[Sleep time was < 500 ms] INFO: start[1230493239937] time[30] tag[codeBlock2.success] message[Sleep time was < 500 ms] INFO: start[1230493239968] time[852] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception] 
 public class someClass { public static void main(String[] args) // your app start point { long start = java.util.Calendar.getInstance().getTimeInMillis(); ... your stuff ... long end = java.util.Calendar.getInstance().getTimeInMillis(); System.out.println("it took this long to complete this stuff: " + (end - start) + "ms"); } } 

使用System.currentTimeMillis()是这样做的正确方法。 但是,如果您使用命令行,并且想要快速地整个程序的时间,请考虑一下:

 time java App 

它允许你不修改你的应用程序的代码和时间。