我只是在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_clocks和http://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/