【问题标题】:CPU cycles vs. total CPU timeCPU 周期与总 CPU 时间
【发布时间】:2016-09-17 16:33:42
【问题描述】:

在 Windows 上,GetProcessTimes() 和 QueryProcessCycleTime() 可用于获取应用程序所有线程的总数。我希望(显然天真地)找到总周期数和总处理器时间(用户+内核)之间的比例关系。当转换为相同的单位(秒)并以应用程序运行时间的百分比表示时,它们甚至不接近;而且它们之间的比例变化很大。

在应用启动后,它们就相当接近了。

3.6353% CPU cycles
5.2000% CPU time
0.79    Ratio

但这个比率会随着应用保持空闲状态而增加(低于 11 小时后,大部分时间处于空闲状态)。

0.0474% CPU cycles
0.0039% CPU time
12.16   Ratio

显然,对用户或内核时间没有贡献的周期被计算在内。我很好奇它是如何工作的。请赐教。

谢谢。

  • 文斯

【问题讨论】:

    标签: windows cpu


    【解决方案1】:

    GetProcessTimes 和 QueryProcessCycleTime 值的计算方式不同。 GetProcesTimes/GetThreadTimes 响应定时器中断而更新,而 QueryProcessCycleTime 值基于对实际线程执行时间的跟踪。当使用和比较两种 API 结果时,这些不同的测量方式可能会导致截然不同的计时结果。尤其是因为 GetThreadTimes 仅包括其线程计数器的完全完成的时隙值(请参阅 http://blog.kalmbachnet.de/?postid=28),这通常会导致不正确的计时。

    由于 GetProcessTimes 通常报告的时间少于实际花费的时间(由于并不总是完成其时间片),因此这是有道理的 与周期测量百分比相比,它的 CPU 时间百分比会随着时间的推移而减少。

    【讨论】:

    • 谢谢,吨。你是说当一个应用过早放弃它的时间片时,它会累积 CPU 周期而不是 CPU 时间?
    • 确实,这是一个有效的假设。上面链接中的示例代码演示了这一点。
    • 再次感谢。有点跑题了。如何获得 NOMINAL CPU 速度?
    • 再次感谢。有点跑题了……我怎样才能获得标称的 CPU 速度?使用 WMI,我可以获得“Intel(R) Core(TM)2 Quad CPU Q6700 @ 2.66GHz”和“2660”(来自 Win32_Processor 的名称和 CurrentClockSpeed)。但是 WMI 很慢。我可以从注册表中获取第一个字符串,但我不知道它是否保证具有可以从中提取标称时钟速度的格式。还有其他方法吗?
    猜你喜欢
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 2020-04-09
    • 2013-11-08
    相关资源
    最近更新 更多