Thread.sleep有多准确?

2022-09-02 01:41:56

我正在研究计算机硬件,我们了解到使用硬件计时器比软件延迟获得更准确的结果。我已经在汇编中编写了1毫秒的软件延迟,我可以启动一个过程,该过程使用此延迟每毫秒重复一次,并使用计数器每100毫秒执行一次其他操作,并且这种技术不如使用硬件计时器准确,我内置于我现在要使用的硬件中。

所以我想知道Java内置的时间有多准确?我们有并且这些可能不使用硬件计时器,那么与硬件计时器相比,这些内置的Java方法有多准确?System.currentTimeMillisThread.sleep


答案 1

Thread.sleep()不准确。准确程度取决于基础操作系统及其计时器和调度程序。我经历过,并行进行的垃圾回收会导致睡眠过度。

在进行“实时”模拟时,您必须纠正主循环中的不准确之处。这可以通过计算预期的唤醒时间并将其与实际唤醒时间进行比较并校正下一个循环中的差异来完成。sleep

如果您需要更好的性能,请查看 Java 实时系统规范。我自己没有使用它,所以我无法提供进一步的细节。


答案 2

我没有发现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);
}

推荐