0

我需要获取 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)

4

3 回答 3

6

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

这只是部分准确。

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

除了精度之外,不同之处在于currentTimeMillis()它与一个众所周知的时间点相关,而nanoTime()与某个任意时间点相关。这意味着您无法轻松地将结果nanoTime()转换为您和我都能理解的时间戳。

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

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

于 2013-01-05T15:50:12.477 回答
1

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

于 2013-01-05T15:50:22.363 回答
0

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

例如,每当一个方法在最近没有运行的情况下被调用,都会有将它放入缓存的开销。根据同一页面中的其他内容,甚至可能会读取磁盘以将其放入内存。

如果 JVM 只运行一次与运行多次相比,它可能会以不同的方式对待方法。

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

于 2013-01-05T16:07:08.690 回答