Java 在多线程代码中,System.nanoTime()会产生小的不精确性

Java 在多线程代码中,System.nanoTime()会产生小的不精确性,java,multithreading,time,Java,Multithreading,Time,在多线程代码中,每当重新调度线程时,System.nanoTime()是否会产生小的不精确性? 如果是,这个错误会累积吗?在单线程代码中也是这样吗 例如,当线程开始执行它时,在开始时使用System.nanoTime()获取时间,然后在退出线程块之前,它使用相同的System.nanoTime()记录时间。您所说的“小误差”是什么意思?尽管System.nanoTime()提供了纳秒分辨率,但无法保证它测量的经过时间的准确性。据我所知,调用System.nanoTime()不会中断线程调度;方法

在多线程代码中,每当重新调度线程时,System.nanoTime()是否会产生小的不精确性? 如果是,这个错误会累积吗?在单线程代码中也是这样吗


例如,当线程开始执行它时,在开始时使用System.nanoTime()获取时间,然后在退出线程块之前,它使用相同的System.nanoTime()记录时间。

您所说的“小误差”是什么意思?尽管
System.nanoTime()
提供了纳秒分辨率,但无法保证它测量的经过时间的准确性。据我所知,调用
System.nanoTime()
不会中断线程调度;方法调用和执行的成本很小,但仅此而已。(当然,如果你做的足够多,那么做很多这样的调用将积累大量的CPU时间。)

请注意,大多数计算机只有软时间,因为任何硬件TrueTime解决方案都是昂贵的。根据硬件、操作系统和编程语言的不同,软时间的准确度可能只有1ms。参考这篇文档:它说它的行为是不可保证的检查一下TrueTime的东西:你如何衡量这种不准确?你有测试吗?对于每个系统来说,500ns或1500ns不是一个小成本。nanoTime(),我自己没有做这些测试,但你可以在这里找到,我只是想知道[link]()@waheebyaqub-如果1500ns是你测量时间的一个重要部分,那么测量的准确性可能是一个更大的误差源。此外,系统负载的变化、垃圾收集器偶尔的暂停以及执行环境的其他变化莫测的变化将带来比1500纳秒多得多的变化。正如链接中投票最多的答案所指出的,检测紧循环的正确方法是统计抽样。它将大量错误平均化,并减少了仪器本身对结果的影响。