我刚在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()好多了。但是为什么呢?我们能相信这个结果吗?
发布于 2011-10-22 19:09:20
如果您的Windows XP安装了SP3,那么您可以相信结果...在Windows平台上,JVM内部实现了nanoTime() ,使用的QueryPerformanceCounter/QueryPerformanceFrequency API基本上位于硬件抽象层,并使用了一些比较精确的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代码!
EDIT 2-根据评论:
nanoTime()是准确测量流逝时间的正确工具,而currentTimeMillis是处理绝对时间的正确工具。
发布于 2011-10-22 19:08:35
为什么?
因为它不会试图以同样的方式做到准确。
在Javadoc中:
此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。
因此,是的,它对于准确测量已用时间是很好的。它不适合给你一个绝对时间,你不会比System.currentTimeMillis()更准确,至少在没有与NTP等明确协调的情况下是这样的。
发布于 2011-10-22 19:10:33
要知道一个方法做了什么,最好的方法是阅读its javadoc。而不是通过实验来猜测它是做什么的。
返回最精确的可用系统计时器的当前值,以纳秒为单位。
此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示从某个固定但任意的时间(可能是在将来,因此值可能是负数)开始的纳秒。这种方法提供了纳秒精度,但不一定是纳秒精度。不能保证值更改的频率。
https://stackoverflow.com/questions/7859043
复制相似问题