如何使用currentTimeMillis()方法以小分数获得执行时间

Wil*_*m A 0 java optimization performance execution-time elapsedtime

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

即使它返回时间,它也会返回30或40.但是,我需要一个更准确的数字,比如30.00012.此外,方法返回类型是long但我改为它,double因为我想要一个浮点数,这有什么害处?你能告诉我以正确的方式测量我的java方法执行挂钟时间的小分数(例如不是8.0而是8.287335)

NPE*_*NPE 6

我知道我可以使用两种方法:currentTimeMillis()nanoTime().但是我已经知道,currentTimeMillis()如果我需要挂钟时间,那就更准确了(就好像我从挂钟测量执行花了多少时间.而不是处理时间).

这只是部分准确.

这两个函数都返回挂钟时间,而不是CPU时间.

除精度之外的差异currentTimeMillis()是相对于众所周知的时间点而言,而是nanoTime()相对于某个任意时间点.这意味着您无法轻松将结果nanoTime()转换为您和我理解的时间戳.

您仍然可以使用它来测量挂钟时间间隔:只需调用nanoTime()两次即可.这几乎就是它的设计目标.

最后,如果您使用它来分析一些代码,请阅读如何在Java中编写正确的微基准测试?有很多细微之处.

  • @WiliamA您引用的文档说"只能用于测量经过的时间".您正在尝试测量经过的时间,因此没有问题.问题是nanoTime结果与日期无关.如果你在星期三开始一份长期工作,而在星期四开始另一份工作,那么周三工作中的nanoTime电话可能会比周四工作后期发生的nanoTime电话更大. (2认同)