繁体   English   中英

如何使用currentTimeMillis()方法获得执行时间的一小部分

[英]How to get the execution time in small fraction using currentTimeMillis() method

我需要获取Java函数的执行时间。 我知道我可以使用两种方法: currentTimeMillis(); nanoTime(); 但是我了解到currentTimeMillis(); 如果我需要挂钟时间(例如,好像我从挂钟测量执行花费了多少时间,而不是处理时间),则它会更准确。

但是currentTimeMillis(); 不能给我小分数。 例如,如果执行时间小于1毫秒,则返回0。即使小于1,我也需要时间,例如0.05 ms。 这是方法返回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因为我想要浮点数,这有什么害处吗? 你能告诉我正确的方法来测量小部分数字(例如,不是8.0而是8.287335)中的java方法执行挂钟时间

我知道我可以使用两种方法: currentTimeMillis()nanoTime() 但是我已经了解到,如果我需要挂钟时间(例如,就像我从挂钟测量执行所花费的时间,而不是处理时间),则currentTimeMillis()会更准确。

这只是部分准确。

这两个函数都返回时钟时间,而不返回CPU时间。

除了精度以外,区别在于currentTimeMillis()相对于一个众所周知的时间点,而nanoTime()相对于某个任意时间点。 这意味着您不能轻易将nanoTime()的结果转换为您和我都会理解的时间戳。

您仍然可以使用它来测量时钟间隔:只需两次调用nanoTime()并取其差。 那几乎就是它的设计目的。

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

使用System.nanoTime()它具有纳秒级的精度。

尽管您可以并且应该使用nanoTime来获取代码块的最精确的可用执行时间。 但是,您应谨慎使用它,因为有许多外部问题会影响执行时间。

例如,任何时候调用方法而没有最近运行,都会有将其放入缓存的开销。 根据同一页面中的其他内容,甚至可能需要读取磁盘以将其放入内存。

如果JVM只运行一次而不是多次运行,则JVM可能会有所不同。

通常,当您关心微秒时,是因为您要测量的东西将在作业或事务中运行多次。 要获得准确的度量,您需要跨多个呼叫进行度量。 这样做还可以减少调用nanoTime的开销时间的影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM