准确性(Accuracy)是与正确答案的接近程度,精确性(Precision)是对这个答案的分辨率。
假设,你问我,”现在几点了?”
我抬头看看太阳,然后估算了一下,回答道 “现在是上午 10 点 35 分 22.131 秒”
我给出的是一个足够精确性的答案,但是不是一个很准确的答案。这个时候,你是否初步理解了 Accuracy 和 Precision 的区别呢?
这个时候,你看了下手表,手表的只有四个指示数字,分别是3、6、9 和 12。你微微皱起眉头,说:”现在是10:05左右。”
你给出的答案是一个比我更加准确的时间,但是却不是那么精确。
现在,我们用上面的概念来理解 Windows 中那些和时间有关的 API。
GetTickCount 这个函数的精度是 1 毫秒,但是它的准确度却没有那么高,这取决于你的 CPU 时钟周期,一般在 10 毫秒到 55 毫秒的范围。 GetSystemTimeAsFileTime 函数以其 100 纳秒的精度看起来更令人印象深刻,但它的准确性不一定比 GetTickCount 好。
如果你在寻找高精度的函数,那么最好使用 QueryPerformanceCounter 函数。但是,你必须做出一些权衡。首先,结果的精度是可变的,你需要调用 QueryPerformanceFrequency 函数来查看精度是多少。另一个权衡是,QueryPerformanceCounter 的更高精度可能更慢地获得。
QueryPerformanceCounter 实际做什么取决于 HAL(在ACPI的帮助下)。性能开发团队告诉我,在最坏的情况下,你可能会从可编程中断计时器上的翻转中断中得到它。这反过来可能需要 PCI 事务,而这并不是世界上最快的事情。它比 GetTickCount 更好,但它不会赢得任何速度比赛。在最好的情况下,HAL 可能会得出结论,RDTSC 计数器以恒定频率运行,因此它改用该频率。在多处理器机器上,事情尤其令人兴奋,你还必须确保从每个处理器上的 RDTSC 返回的值彼此一致!然后,为了更好地衡量,为已知的错误硬件提供一些绕开方法。
总结
在 拓扑梅尔智慧办公平台 的开发中,我主要使用了 GetTickCount,我觉得对我而言,最重要的一句话是:
GetTickCount 这个函数的精度是 1 毫秒,但是它的准确度却没有那么高,这取决于你的 CPU 时钟周期,一般在 10 毫秒到 55 毫秒的范围。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Precision is not the same as accuracy》