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

Geo*_*Mic 81 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);
Run Code Online (Sandbox Code Playgroud)

bua*_*bua 133

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));
Run Code Online (Sandbox Code Playgroud)

  • 使用`final`的@dijxtra具有不会意外分配给它的优点(以及其他优点,例如匿名类访问等).在这段代码中它不会有所作为.这是一种相当普遍的做法,如果你需要的话,把所有东西都做成"最终的",并且只有非最终的. (8认同)
  • 不应该是nanoTime.见rhu的回答. (6认同)
  • 你在这里使用"最终"有什么特别的原因吗?如果删除该关键字会有什么不同? (4认同)
  • 实际上应该是nanoTime (2认同)

rhu*_*rhu 34

请注意,有些问题System#nanoTime()无法在多核CPU上可靠地用于记录经过的时间......每个核心都维护着自己的TSC(时间戳计数器):此计数器用于获取纳秒时间(实际上它是自CPU启动以来的滴答数).

因此,除非操作系统进行一些TSC时间扭曲以保持内核同步,否则如果在获取初始时间读数时在一个内核上调度线程,然后切换到不同的内核,则相对时间可能偶尔会向后跳跃和转发.

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

此外,System#nanoTime()在VirtualBox环境中使用java时,(AFAIK)是一个迄今为止未修复的错误; 为我们造成各种奇怪的间歇性线程问题,因为很多java.util.concurrency包都依赖于纳米时间.

也可以看看:

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


Bal*_*usC 9

你可以利用System#nanoTime().在执行之前和之后获取它并进行数学运算.它之上System#currentTimeMillis()是首选,因为它具有更好的精度.根据所使用的硬件和平台,您可能会在经过的时间内获得不正确的间隙.在Windows上使用Core2Duo,在大约0到~15ms之间实际上无法计算任何内容.

更高级的工具是剖析器.


Jon*_*erg 7

您将获得当前系统时间(以毫秒为单位):

final long startTime = System.currentTimeMillis();
Run Code Online (Sandbox Code Playgroud)

那你就做你要做的事:

for (int i = 0; i < length; i++) {
  // Do something
}
Run Code Online (Sandbox Code Playgroud)

然后你看看花了多长时间:

final long elapsedTimeMillis = System.currentTimeMillis() - startTime;
Run Code Online (Sandbox Code Playgroud)