【问题标题】:java - system.nanoTime() runs too slowjava - system.nanoTime() 运行太慢
【发布时间】:2012-04-05 10:23:08
【问题描述】:

我在我的应用程序中使用 system.nanoTime 并计算相对于开始时间的时间。
我的应用程序运行得非常好,直到我将它复制到一台新计算机上,并且纳米时间给了我较慢的值。

我写了一个简单的应用程序只是为了确保。
纳米时间与系统时间进行比较。
它在除我的新计算机之外的其他计算机中显示相同的值。有什么建议么?

这是我的代码: 首先我有

private long initNanoTime = System.nanoTime();
private long initTime = System.currentTimeMillis();

比我循环一个每秒运行的线程:

long timeUsingNanoTime = initTime + (System.nanoTime() - initNanoTime) / 1000000;
long timeUsingMilis = System.currentTimeMillis();
long nanotimeOffset = Math.abs(timeUsingNanoTime - timeUsingMilis);
if (nanotimeOffset < 100l) ? print("close") : print(far);

编辑:我使用 nano 是因为我需要处理在 nano 时间内发生的甚至 ts 并将接收到的 nano time 打印到日志中

【问题讨论】:

  • “给我更慢的价值”是什么意思。方法执行是否需要更多时间,或者您是否获得了您不期望的值?也许这可以帮助你stackoverflow.com/questions/351565/…

标签: java nanotime


【解决方案1】:

就像 Java API 文档所说的 System.nanoTime()

此方法只能用于测量经过的时间,不能用于 与系统或挂钟时间的任何其他概念有关。价值 返回代表纳秒,因为一些固定但任意的来源 时间(也许在将来,所以值可能是负数)。相同 在 a 的实例中,此方法的所有调用都使用 origin Java虚拟机;其他虚拟机实例可能 使用不同的来源。

此方法提供纳秒级精度,但不一定 纳秒分辨率(即值更改的频率) - 否 除了决议至少与 currentTimeMillis() 的那个。

它不提供与时间戳(currentTimeMillis)的任何耦合,也不提供固定的分辨率。

在您的情况下,Java 现在似乎有比以前更高分辨率的计时器,因此不需要使用系统时间。

【讨论】:

  • 是不是比nanotime的6和5版本更可靠docs.oracle.com/javase/6/docs/api/java/lang/…
  • 他们说的基本一样。两者都声明nanoTime 不与任何特定来源耦合,因此您不能依赖它。他们只是在 Java7 文档中添加了更多解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 2020-02-04
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多