【问题标题】:inconsistent time elapsed in javajava中经过的时间不一致
【发布时间】:2015-06-03 06:31:16
【问题描述】:

我正在尝试使用 nanoTime 计算 java 中经过的时间。但每次它给我不同的结果。为什么总是不一致?

示例代码:

long startTime=System.nanoTime();
String.valueOf(number).length();
long endTime = System.nanoTime();
System.out.println(endTime-startTime);

【问题讨论】:

  • 为什么需要保持一致?
  • 好吧,因为 CPU 负载和 状态 并不总是相同的(每次都不同)。正如@Gosu 建议的那样,这不是进行适当的微基准测试的正确方法
  • 这样的代码永远无法给出一致的时间;正如@defectus 所说,您必须问自己为什么需要保持一致。这看起来像一个 XY 问题,那么你想要实现什么?
  • 为了保持一致性,使用毫秒而不是纳秒来计算经过的时间。

标签: java time int


【解决方案1】:

nanoTime() 和它的姐妹currentTimeMillis() 并不精确,并且取决于您运行代码的架构,它们会遭受舍入(有关详细信息,请参阅javadoc):

This method provides nanosecond precision, but not necessarily nanosecond resolution 
(that is, how frequently the value changes) -
no guarantees are made except that the resolution is at least as good
as that of currentTimeMillis().

如果您测量时间以确定替代 a 或 b 是否更快,那么您基本上是在进行微基准测试。有这方面的框架,你应该使用它们。可能最著名的 Java 是JMH。如果您需要对较大的代码部分执行相同的操作,您可以考虑进行分析。

您可能想看看这个 stackoverflow 帖子:How do I write a correct micro-benchmark in Java?

【讨论】:

    【解决方案2】:

    流逝的时间将根据 JVM 的执行方式以及将处理时间分配给执行此代码的线程的方式而有所不同。 我尝试了多次运行,结果总是在 9000 到 11000 纳秒之间。这看起来相当一致。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 2011-09-04
      相关资源
      最近更新 更多