我需要在Java中获取函数的执行时间。我知道我可以使用两种方法:
currentTimeMillis();
和nanoTime();
但我了解到currentTimeMillis();
如果我需要挂钟时间更准确(就好像我从挂钟测量执行的时间一样)花了。不是处理时间)。
但是currentTimeMillis();
不能给我一小部分号码。例如,如果执行时间小于1毫秒,则返回0.我需要时间,即使它小于1,比如说0.05毫秒。当方法返回0时,这是一个简单的例子。
long startTime=System.currentTimeMillis();
for(int x=0; x<10;x++)
{
System.out.println("-");
}
long execTime=System.currentTimeMillis() - startTime;
即使它返回时间,它也会返回30或40.但是,我需要一个更精确的数字,比如30.00012。此外,方法返回类型为long
但我将其更改为double
,因为我想要浮点数,这有什么害处吗?你能告诉我以正确的方式测量我的java方法执行挂钟时间的小分数(例如不是8.0但是8.287335)
答案 0 :(得分:6)
我知道可以使用的两种方法:
currentTimeMillis()
和nanoTime()
。但是我已经知道,如果我需要挂钟时间,currentTimeMillis()
更准确(就好像我从挂钟测量执行花了多少时间。不是处理时间)。
这只是部分准确。
这两个函数都会返回挂钟时间,而不是CPU时间。
除了精确度之外,差异在于currentTimeMillis()
与众所周知的时间点相关,而nanoTime()
与某个任意时间点相关。这意味着您无法轻松将nanoTime()
的结果转换为您和我理解的时间戳。
您仍然可以使用它来衡量挂钟时间间隔:只需拨打nanoTime()
两次即可。这就是它的设计目标。
最后,如果你使用它来分析一些代码,请阅读How do I write a correct micro-benchmark in Java?有很多细微之处。
答案 1 :(得分:1)
使用System.nanoTime()
它的精确度为纳秒。
答案 2 :(得分:0)
尽管您可以而且应该使用nanoTime来获得一段代码的最精确的可用执行时间。但是,您应该谨慎使用它,因为有许多外部问题会影响执行时间。
例如,无论何时在没有最近运行的情况下调用方法,都会有将其置于缓存中的开销。根据同一页面中的其他内容,甚至可能会有磁盘读取以将其存入内存。
如果一个方法只运行一次,与多次运行相比,它可能会以不同的方式对待它。
通常,当你关心微秒时,这是因为你测量的东西会在作业或交易中多次运行。要准确衡量您需要在多个呼叫中进行衡量。这样做还可以减少调用nanoTime的开销时间的影响。