我只是在Windows XP上找到System.currentTimeMillis is not accurate,现在我尝试使用相同的代码进行System.nanoTime()

由于1ms = 1,000,000ns,所以我认为结果应该是15,000,000ns,但事实并非如此。

请参见示例代码:

public class NanoTime {
    public static void main(String[] args) {
        long start = 0;
        long end = 0;
        while (true) {
            if (start == 0) {
                start = System.nanoTime();
            } else {
                long current = System.nanoTime();
                if (current != start) {
                    end = current;
                    break;
                }
            }
        }
        System.out.println("The time interval of your OS: " + (end - start) + "ns");
    }
}


结果是:

The time interval of your OS: 655ns


似乎比System.currentTimeMillis()好得多。但为什么?我们可以相信这个结果吗?

最佳答案

如果您的Windows XP具有SP3,那么您可以相信结果...在Windows上,JVM使用nanoTime() API在内部实现QueryPerformanceCounter/QueryPerformanceFrequency,该API基本位于HAL(硬件抽象层)中,并使用一些CPU内部间隔指令,它们分别是相当准确...仅适用于间隔测量,不适用于时间处理...

有关更详细的描述,请参见http://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clockshttp://juliusdavies.ca/posix_clocks/clock_realtime_linux_faq.html

编辑-根据评论:

当调用nanoTime时,上述函数由JVM本身内部使用,这与JNI完全没有关系-它们不会暴露于Java代码中!

编辑2-根据评论:

nanoTime()是正确测量经过时间的正确工具,而currentTimeMillis是处理绝对时间的正确工具。

关于java - Windows XP上的System.nanoTime(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7859043/

10-11 10:45