3

我看过很多关于系统时钟的讨论,据说例如 Windows 下的标准 PC 时钟的精度仅为 +/-10 毫秒,而实时系统时钟的精度为亚毫秒级。但这些说法是什么意思?这种时序可变性的显着程度完全取决于测量时钟时序的时间间隔。如果两个连续的时钟调用返回的时间戳相差 10 毫秒,那将是一场灾难,幸运的是,情况并非如此;但是,如果一个时钟在一个月内只损失/增加 10 毫秒,那么对于任何实际目的来说,这几乎都是完美的时间。以不同的方式提出问题,如果我进行两次相隔 1 秒的时钟调用,我可以预期到何种程度的不准确,例如标准 PC-Windows、PC-realtime(例如,带有支持它的 mb 的 QNX),以及麦克?

4

2 回答 2

1

您的问题可能会引发更大的讨论。当您谈论测量时钟的时间间隔时,我相信这称为漂移。如果两个连续时钟调用的时间戳相差 10ms,可能处理时间很长,可能有中断,可能时钟漂移那么严重,可能报告精度以 10ms 为单位,可能存在舍入误差等。系统时钟的报告精度取决于其速度(即 1GHz = 1ns)、硬件支持和操作系统支持。抱歉,我不知道 Windows 与 Mac 相比如何。

于 2011-09-22T06:41:33.277 回答
0

由于您没有链接到有关此主题的任何具体讨论,因此我只能从 Java 方面传达我在此主题上的一些经验:

前段时间经典的粒度很差(在 Windows XP 上为 15 毫秒)。System.currentTimeMillis()这意味着任何两个不返回相同值的相邻调用之间的最小可能差异是 15 毫秒。System.currentTimeMillis()因此,如果您测量一个耗时 8 毫秒的事件,那么您会得到0 毫秒15 毫秒的结果。

对于测量小的时间跨度,这显然是灾难性的。对于测量更长的时间跨度,这不是一个真正的问题。

这就是为什么引入 Java 的主要原因之一System.nanoTime,它是专门为测量小时间跨度而设计的,并且通常(即当操作系统支持它时)具有精细的粒度(在我测试过的所有系统上,它从未返回相同的值两次, 即使连续调用两次而没有计算 nbetween)。

因此,只要您使用正确的 API ,现代计算机通常可以提供非常细粒度和非常精确的时间测量。

于 2011-09-22T06:53:15.373 回答