我正在研究计算机硬件,我们了解到使用硬件计时器比软件延迟获得更准确的结果。我已经在汇编中编写了 1 毫秒的软件延迟,我可以启动一个使用此延迟重复每毫秒的进程,并使用计数器每 100 毫秒执行一次其他操作,并且这种技术不如使用我使用的硬件计时器准确内置了我现在要使用的硬件。
所以我想知道Java内置的计时有多准确?我们有System.currentTimeMillis
并且Thread.sleep
这些可能不使用硬件计时器,那么与硬件计时器相比,这些内置 Java 方法的准确性如何?
Thread.sleep()
不准确。不准确的程度取决于底层操作系统及其计时器和调度程序。我经历过并行进行的垃圾收集会导致过度睡眠。
在进行“实时”模拟时,您必须纠正主循环的不准确性sleep
。这可以通过计算预期的唤醒时间并将其与实际的唤醒时间进行比较并在下一个循环中校正差异来完成。
如果您需要更好的性能,请查看 Java实时系统规范。我自己没有使用过,所以无法提供更多细节。
我没有发现 Thread.sleep 是准确的。事实上,我发现它似乎睡得比它承诺的要少。
配置为休眠 1 毫秒时的结果:
********* Average elapsed time = 957 micro seconds
下面是我的测试:
public static void main(String[] args) throws InterruptedException {
List<Long> list = new ArrayList<Long>();
int i= 0;
while(i <=100){
long authStartTime = System.nanoTime();
Thread.sleep(1);
long elapsedTime = System.nanoTime() - authStartTime;
System.out.println("*****"+elapsedTime/1000+ " mics");
list.add(elapsedTime);
i++;
}
long sum=0;
for(long l : list){
sum = sum + l;
}
System.out.println("********* Average elapsed time = "+sum/list.size()/1000+" micro seconds");
System.exit(0);
}
来自 Java 语言规范。
Thread.sleep 使当前正在执行的线程在指定的持续时间内休眠(暂时停止执行),具体取决于系统计时器和调度程序的精度和准确性。线程不会失去任何监视器的所有权,并且恢复执行将取决于调度和执行线程的处理器的可用性。