Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取windows内核模式下进程使用的CPU时钟周期?_C++_Windows_Cpu Cycles - Fatal编程技术网

C++ 如何获取windows内核模式下进程使用的CPU时钟周期?

C++ 如何获取windows内核模式下进程使用的CPU时钟周期?,c++,windows,cpu-cycles,C++,Windows,Cpu Cycles,正如标题所示,我感兴趣的是仅在内核模式下获取进程使用的CPU时钟周期。我知道有一个API叫做“QueryProcessCycleTime”,它返回CPU时钟 进程线程使用的周期。但该值包括在用户模式和内核模式下花费的周期。如何获得仅在内核模式下使用的周期?我是否需要使用性能计数器获取此信息?如果是,我应该使用哪一个 提前感谢您的回答。请查看。它将为您提供进程所使用的内核和用户时间。我刚刚找到一篇有趣的文章,它几乎描述了您所要求的内容。正在播放 他们在那里写道,如果您使用的是C#或C++/CLI,

正如标题所示,我感兴趣的是仅在内核模式下获取进程使用的CPU时钟周期。我知道有一个API叫做“QueryProcessCycleTime”,它返回CPU时钟 进程线程使用的周期。但该值包括在用户模式和内核模式下花费的周期。如何获得仅在内核模式下使用的周期?我是否需要使用性能计数器获取此信息?如果是,我应该使用哪一个


提前感谢您的回答。

请查看。它将为您提供进程所使用的内核和用户时间。

我刚刚找到一篇有趣的文章,它几乎描述了您所要求的内容。正在播放

他们在那里写道,如果您使用的是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上最好的。顺便说一句,在类似的问题中也有一些信息: