c++ - 测量 CPU 周期或其他不依赖于 CPU 频率且不计算睡眠时间/周期的单位?WinAPI C++
问题描述
我需要两种方式的分析功能。第一个是代码花费的总时间,第二个是一个不依赖于 cpu-freq 并在代码中休眠的单元。(我们的软件需要使用自己的语言/解释器进行分析,它在 Windows 上运行)
我的问题是第二个。
- 结果
GetThreadTimes
取决于 cpu-freq 并且不准确 (10 - 15ms) 请参阅更多信息:为什么 GetThreadTimes 错误?卡姆巴赫内特 QueryThreadCycleTime
也取决于实施。(并且也计入睡眠,正如我测试的那样)查看更多信息:QueryThreadCycleTime 实际上算什么?旧新事物QueryPerformanceCounter
是一个准确的计数器,但是 cpu-freq-change 改变了结果并且还包括了休眠。
我想做什么有可能吗?还是有其他方法?Visual Studio 分析如何/做什么?
注意:我知道我的问题似乎是重复的。我试图评论相同问题的一些旧答案(例如:另一个问题)以获得更好的答案,但我的评论在 1-2 天后被删除。(请参阅:删除评论的元数据)
编辑:(我的测试代码QueryThreadCycleTime
)
static void foo()
{
for (int i = 0; i < 3; i++)
{
Sleep(20);
for (int x = 0; x < 1000; x++)
x = x + 1 - 1;
}
}
static void testCycles()
{
HANDLE hThread = nullptr;
::DuplicateHandle(::GetCurrentProcess(), ::GetCurrentThread(), ::GetCurrentProcess(), &hThread, 0, false, DUPLICATE_SAME_ACCESS);
std::vector<ULONG64> results;
results.resize(7);
for (auto &tElapsed : results)
{
ULONG64 tStart = 0;
::QueryThreadCycleTime(hThread, &tStart);
foo();
ULONG64 tEnd = 0;
::QueryThreadCycleTime(hThread, &tEnd);
tElapsed = tEnd - tStart;
}
::CloseHandle(hThread);
}
并且有结果;
带睡眠(20)
在螺纹 123383 192271 128028 208208 277983 223377 155222
在主线程 191616 120002 126258 125267 141934 204753 125243
带睡眠(1000)
在螺纹 121595 143863 182068 307464 388448 342315 468244
在主线程 289568 256256 348599 359328 234065 167849 299888
解决方案
推荐阅读
- node.js - 无法在本地安装“npm install -g yo”全局。
- powershell - cURL to PowerShell - 包含多个项目的哈希表
- c++ - Xcode - Clang 错误:未找到架构 x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- node.js - 使用存储在 mongo 数据库节点和 express 中的凭据登录用户
- r - 无法在 Windows 上安装 [R] 包 KernSmooth - 错误:包“KernSmooth”不可用(适用于 R 版本 3.5.1)
- r - R中的环境问题
- android - 为新的应用程序发布创建新的密钥库
- go - 所谓的裸函数上的 serveHTTP 实用程序从何而来
- javascript - 如何在侧边栏菜单上设置“隐藏”和显示
- google-apps-script - 谷歌应用脚本返回多行数组