6

我想知道 Windows APIGetTickCount()实际测量的是什么?它是否测量从按下系统电源按钮的那一刻起的时间?它是否也测量引导加载程序或 BIOS 加载所花费的时间?我正在尝试测量 Windows 7 上的启动时间。

4

3 回答 3

16

您不应该将其视为测量“自”以来的时间。仅将其用作相对时钟源。换句话说,调用GetTickCount一次,然后做某事,然后再次调用它,然后减去。不要使用滴答计数的绝对值。

确切的启动时间未指定,在调试 Windows 版本时,“启动时间”被人为设置为过去 49.7 天,以暴露计时器翻转错误。

于 2013-05-07T16:34:18.437 回答
4

由于官方文档没有具体说明,您只能假设启动期间的精确时刻并没有真正定义,并且它在不同版本的 Windows 上可能会有所不同。但是考虑到使用虚拟化和仿真,“自从按下电源按钮”将毫无意义。您可能希望的最佳一致定义是 Windows 开始提供中断服务的时刻——系统时钟可用的最早时刻。

于 2013-03-19T15:10:00.297 回答
0

GetTickCount() 主要用于测量短时间间隔。GTC的零点基本上是未定义的。

另外,据我所见,GTC 与 的值非常匹配QueryPerformanceCounter() * 1000 / QueryPerformanceFrequency(),所以我猜这就是它在支持 QPC 和 QPF 的机器上的实现方式。

现在,有两个常用选项可用于确定 Windows 正常运行时间。

  1. 查询\\.\System\System Up Time性能计数器。当心非英语盒子上的警告。另外,根据我的测试,这个方法在 Wow64 下根本不起作用,PdhCollectQueryData返回 NO_DATA。

  2. LastBootUpTime对来自 的值运行 WMI 查询Win32_OperatingSystem table。这很重,因此您通常希望获取并缓存它。它也很脆弱,因为 WMI 可以以神秘的方式破坏。最后,我看到systeminfo基于 WMI 的标准实用程序返回无效的启动时间,该时间已关闭超过 1 天。

另一种选择是用于GetSystemTimes获取所有 CPU 的空闲/内核/用户时间,将它们统计起来,除以 CPU 计数并将其作为正常运行时间的近似值。对此进行了实验后,我发现它相当不精确,并且比正常正常运行时间要高。

因此,总而言之,没有简单且轻量级的方法来确定 Windows 上的启动时间或正常运行时间。没有什么能比得上/proc/uptime在 *nix 上阅读的。惊喜,惊喜。

于 2013-05-07T14:47:25.250 回答