对于 QPC,您可以致电QueryPerformanceFrequency
以获取其更新速度。除非您正在使用time
,否则无论如何您将获得超过 0.5 秒的计时精度,但clock
并不是那么准确 - 通常是 10 毫秒段[尽管显然CLOCKS_PER_SEC
标准化为 100 万,使数字看起来更准确]。
如果你按照这些思路做一些事情,你可以计算出你可以测量的间隙有多小[尽管在非常高的频率下你可能无法注意到有多小,例如每个时钟周期更新的时间戳计数器,读取它需要 20 -40 个时钟周期]:
time_t t, t1;
t = time();
// wait for the next "second" to tick on.
while(t == (t1 = time())) /* do nothing */ ;
clock_t old = 0;
clock_t min_diff = 1000000000;
clock_t start, end;
start = clock();
int count = 0;
while(t1 == time())
{
clock_t c = clock();
if (old != 0 && c != old)
{
count ++;
clock_t diff;
diff = c - old;
if (min_diff > diff) min_diff = diff;
}
old = c;
}
end = clock();
cout << "Clock changed " << count << " times" << endl;
cout << "Smallest differece " << min_diff << " ticks" << endl;
cout << "One second ~= " << end - start << " ticks" << endl;
显然,您可以将相同的原理应用于其他时间源。
(未经过编译测试,但希望不会有太多错别字和错误)
编辑:因此,如果您测量 10 秒范围内的时间,则以 100Hz 运行的计时器将为您提供 1000 个“滴答声”。但它可能是 999 或 1001,这取决于你的运气,你抓住它是对的/错的,所以那里是 2000 ppm - 然后时钟输入也可能会有所不同,但它的变化要小得多,最多 100 ppm。对于 Linux,clock()
以 100Hz 更新(运行操作系统的实际计时器可能以更高的频率运行,但clock()
在 Linux 中将以 100Hz 或 10ms 的间隔更新[并且它仅在使用 CPU 时更新,因此坐 5 秒等待用户输入是 0 次]。
在 windows 中,clock()
测量实际时间,就像你的手表一样,不仅仅是 CPU 正在使用,所以等待用户输入的 5 秒被计算为 5 秒时间。我不确定它有多准确。
您会发现的另一个问题是,现代系统通常不太擅长可重复的计时——无论您做什么,操作系统、CPU 和内存都会合力使生活变得痛苦,以获得相同的时间两次运行。如今,CPU 经常以故意可变时钟运行(允许漂移约 0.1-0.5%)以减少 EMC 的电磁辐射,(电磁兼容性)测试可以“偷偷溜出”那个密封良好的计算机盒的尖峰。
换句话说,即使你能得到一个非常标准化的时钟,你的测试结果也会上下波动,这取决于你无能为力的其他因素......
总而言之,除非您正在寻找一个数字来填写表格,该表格要求您为时钟精度提供 ppm 数字,并且这是您不能不填写该信息的政府表格,否则我并不完全相信了解用于测量时间本身的计时器的准确性非常有用。因为其他因素至少会起到同样重要的作用。