2

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。

4

1 回答 1

7

System.nanoTime()javadoc说,

在 Java 虚拟机实例中,此方法的所有调用都使用相同的来源;其他虚拟机实例可能使用不同的来源。

仅当计算在 Java 虚拟机的同一实例中获得的两个此类值之间的差异时,此方法返回的值才有意义。

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

于 2016-11-26T06:36:55.323 回答