2013-02-24 80 views
0

在多线程代码System.nanoTime()产生很小的不准确性,每当线程被重新安排? 如果是的话,这个错误会累积,这在单线程代码中也是如此吗?在多线程代码System.nanoTime()产生很小的不准确性

例如,当线程开始执行在开始使用System.nanoTime()刚刚从线程块中退出它使用相同的System.nanoTime()

+1

请注意,大多数计算机只有软时间,因为任何硬件TrueTime解决方案都很昂贵。根据硬件,操作系统和编程语言的不同,软件时间的准确性可能高达1ms。请参阅此文档:http://docs.oracle.com/javase/6/docs/api/java/lang/System.html#nanoTime()它表示它的行为不保证 – 2013-02-24 09:24:01

+0

检查TrueTime的东西: http://www.symmetricom.com/ – 2013-02-24 09:25:52

+0

你如何衡量这种不准确?你有测试吗? – 2013-02-24 19:16:14

回答

1

你是什么意思记录时间之前得到它的时候再由“小错误”?尽管System.nanoTime()为您提供了纳秒级的分辨率,但它不能保证它所测量的经过时间的准确性。据我所知,调用System.nanoTime()不会中断线程调度;方法调用和执行的成本很低,但就是这样。 (当然,如果你做了足够的这些调用,那么执行大量的这些调用将累积相当多的CPU时间。)

+0

对于每个System.nanoTime(),500ns或1500ns是不小的代价,我没有做这些测试我自己,但你可以在这里找到它,我只是想知道[链接](http://stackoverflow.com/questions/ 2476203/java-system-nanotime-is-really-slow-is-it-the-it-possible-implement -per-high-performance) – waheebyaqub 2013-02-24 09:57:31

+0

@waheebyaqub - 如果1500 ns是测量时间的重要部分,那么测量的准确性可能是更大的误差来源。此外,系统负载的变化,垃圾收集器的偶尔暂停以及执行环境的其他变化会引入比1500ns更多的变化。就像您的链接中最新推出的答案指出的那样,正确处理严格循环的方法是统计抽样。它平均出大量的错误,并减少仪器本身在结果中的影响。 – 2013-02-24 17:06:22