java - System.nanoTime() 在 java 7 和 java 8 之间返回不同的值

标签 java nanotime

System.nanoTime() 针对 java 7 和 java 8 编译和运行相同的代码时返回不同的值。

这段代码:

public class nanoTime
{
    public static void main(String... args)
    {
      System.out.println("Found JVM: "
          + " " + System.getProperty("java.vm.vendor")
          + " " + System.getProperty("java.version")
          + " " + System.getProperty("java.vm.name")
          );
      System.out.println("time is "+ System.nanoTime());
    }
}

在 java 7 上打印这个

~ gdate +%s%N && javac7-oraclejdk nanoTime.java && java7-oraclejdk nanoTime
1480143769271605000
Found JVM:  Oracle Corporation 1.7.0_80 Java HotSpot(TM) 64-Bit Server VM
time is 1480143769807547000

这是在 java 8 上的

~ gdate +%s%N && javac nanoTime.java && java nanoTime
1480143724152650000
Found JVM:  Oracle Corporation 1.8.0_92 Java HotSpot(TM) 64-Bit Server VM
time is 527819867675375

为什么以及如何发生这种情况?

运行环境为mac Sierra。

最佳答案

System.nanoTime() javadoc 说,

The same origin is used by all invocations of this method in an instance of a Java virtual machine; other virtual machine instances are likely to use a different origin.

The values returned by this method become meaningful only when the difference between two such values, obtained within the same instance of a Java virtual machine, is computed.

您正在比较不同 JVM 实例(以及不同来源和版本)的结果。那是没有意义的。只要保留 API 中指定的行为,在 Java 版本之间更改实现是完全合法的。

关于java - System.nanoTime() 在 java 7 和 java 8 之间返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40815674/

相关文章:

java - 如何管理 LocalConverter 以及何时调用 ShutDown() 方法?

java - 如何使用 Opencv 将 PNG 从 Java 类传递到 Android 中的 Native 类

Java - 将纳秒转换为 HH/MM/SS

java - 如何在网页上设置数值和按下按钮?

java - 导入 sbt 项目时出错 : string. 类已损坏

java - 在 Java 中仅对查询键和参数进行 url 编码的最佳方法是什么?

java - 将 python time.time() 转换为 java.nanoTime()

Java System.nanoTime 经过的平均时间不断变小

java - 系统无法处理以纳秒为单位触发的事件,为什么?

java - 除以 1e9d 是什么意思?