C++ 如何获取windows内核模式下进程使用的CPU时钟周期?
正如标题所示,我感兴趣的是仅在内核模式下获取进程使用的CPU时钟周期。我知道有一个API叫做“QueryProcessCycleTime”,它返回CPU时钟 进程线程使用的周期。但该值包括在用户模式和内核模式下花费的周期。如何获得仅在内核模式下使用的周期?我是否需要使用性能计数器获取此信息?如果是,我应该使用哪一个C++ 如何获取windows内核模式下进程使用的CPU时钟周期?,c++,windows,cpu-cycles,C++,Windows,Cpu Cycles,正如标题所示,我感兴趣的是仅在内核模式下获取进程使用的CPU时钟周期。我知道有一个API叫做“QueryProcessCycleTime”,它返回CPU时钟 进程线程使用的周期。但该值包括在用户模式和内核模式下花费的周期。如何获得仅在内核模式下使用的周期?我是否需要使用性能计数器获取此信息?如果是,我应该使用哪一个 提前感谢您的回答。请查看。它将为您提供进程所使用的内核和用户时间。我刚刚找到一篇有趣的文章,它几乎描述了您所要求的内容。正在播放 他们在那里写道,如果您使用的是C#或C++/CLI,
提前感谢您的回答。请查看。它将为您提供进程所使用的内核和用户时间。我刚刚找到一篇有趣的文章,它几乎描述了您所要求的内容。正在播放 他们在那里写道,如果您使用的是C#或C++/CLI,您可以很容易地从指向正确PID的
System.Diagnostic.Process
类的实例中获取该信息。但是它会从PrivilegedProcessorTime
中为您提供一个时间跨度
,因此是一个“相当长的时间”而不是“周期”
但是,他们也指出,.NET代码实际上是非托管API的瘦包装,所以您也应该能够很容易地从本地C++获得它。他们对该类进行了修改,以显示其调用的内容,但图像丢失了。我刚才也做了同样的操作,它使用了
kernel32.dll中的GetProcessTimes
因此,再次,-它返回LPFILETIME
结构。所以,又是“美好时光”,而不是“循环”
该方法的描述指出,如果要获取时钟周期,应使用函数。这实际上返回了时钟周期的数量。。但是用户模式和内核模式一起计算
现在,总结一下:
- 你可以阅读userTIME
- 你可以阅读内核时间
- 您可以读取(用户+内核)周期
所以你几乎拥有了所有需要的东西。通过一些简单的数学计算:
u_cycles = u_time * allcycles / (utime+ktime)
k_cycles = k_time * allcycles / (utime+ktime)
当然,由于四舍五入等原因,这将是一些近似值
此外,这将有一个问题:您必须调用两个函数(GetTimes、QueryCycles)来获取所有信息,因此它们的读数之间会有一点延迟,因此所有的计算可能会有一点滑动,因为目标进程仍在运行并消耗时间
如果您无法在测量中考虑到这种(小?)噪声,我认为您可以通过暂时暂停过程来规避它:
- 中止目标
- 稍等一下,确保它已暂停
- 先读统计数据
- 读取第二个统计数据
- 然后继续此过程并计算值
我认为这将确保两个读数保持一致,但反过来,每一个读数都会影响测量过程的整体性能-因此,像“墙时间”这样的事情将不再是可测量的,除非您对暂停时间进行一些更正
可能有更好的方法来获取单独的时钟周期,但我没有找到它们,抱歉。您可以尝试查看QueryProcessCycleTime
内部以及它读取数据的来源-也许您很幸运,它读取A、B并返回A+B,也许您可以查看这些来源。我没有检查它。但是GetProcessTimes是否返回CPU时钟周期?我不确定。谢谢分享这些信息,我一定会调查的。但是,正如你在最后一段中提到的,我也认为必须有一种更简单的方法来实现这一点。谷歌搜索没有显示太多,也许它不是常见的req。我刚刚查看了结构,它传递了一个大整数
,结果是100ns的时间间隔数
。。我开始相信上面提到的手动计算是winz上最好的。顺便说一句,在类似的问题中也有一些信息: