你如何计算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)
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
你可以利用System#nanoTime().在执行之前和之后获取它并进行数学运算.它之上System#currentTimeMillis()是首选,因为它具有更好的精度.根据所使用的硬件和平台,您可能会在经过的时间内获得不正确的间隙.在Windows上使用Core2Duo,在大约0到~15ms之间实际上无法计算任何内容.
更高级的工具是剖析器.
您将获得当前系统时间(以毫秒为单位):
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)
| 归档时间: |
|
| 查看次数: |
92289 次 |
| 最近记录: |