我想知道 Windows APIGetTickCount()
实际测量的是什么?它是否测量从按下系统电源按钮的那一刻起的时间?它是否也测量引导加载程序或 BIOS 加载所花费的时间?我正在尝试测量 Windows 7 上的启动时间。
3 回答
您不应该将其视为测量“自”以来的时间。仅将其用作相对时钟源。换句话说,调用GetTickCount
一次,然后做某事,然后再次调用它,然后减去。不要使用滴答计数的绝对值。
确切的启动时间未指定,在调试 Windows 版本时,“启动时间”被人为设置为过去 49.7 天,以暴露计时器翻转错误。
由于官方文档没有具体说明,您只能假设启动期间的精确时刻并没有真正定义,并且它在不同版本的 Windows 上可能会有所不同。但是考虑到使用虚拟化和仿真,“自从按下电源按钮”将毫无意义。您可能希望的最佳一致定义是 Windows 开始提供中断服务的时刻——系统时钟可用的最早时刻。
GetTickCount() 主要用于测量短时间间隔。GTC的零点基本上是未定义的。
另外,据我所见,GTC 与 的值非常匹配QueryPerformanceCounter() * 1000 / QueryPerformanceFrequency()
,所以我猜这就是它在支持 QPC 和 QPF 的机器上的实现方式。
现在,有两个常用选项可用于确定 Windows 正常运行时间。
查询
\\.\System\System Up Time
性能计数器。当心非英语盒子上的警告。另外,根据我的测试,这个方法在 Wow64 下根本不起作用,PdhCollectQueryData
返回 NO_DATA。LastBootUpTime
对来自 的值运行 WMI 查询Win32_OperatingSystem table
。这很重,因此您通常希望获取并缓存它。它也很脆弱,因为 WMI 可以以神秘的方式破坏。最后,我看到systeminfo
基于 WMI 的标准实用程序返回无效的启动时间,该时间已关闭超过 1 天。
另一种选择是用于GetSystemTimes
获取所有 CPU 的空闲/内核/用户时间,将它们统计起来,除以 CPU 计数并将其作为正常运行时间的近似值。对此进行了实验后,我发现它相当不精确,并且比正常正常运行时间要高。
因此,总而言之,没有简单且轻量级的方法来确定 Windows 上的启动时间或正常运行时间。没有什么能比得上/proc/uptime
在 *nix 上阅读的。惊喜,惊喜。