首页 > 解决方案 > 测量 CPU 周期或其他不依赖于 CPU 频率且不计算睡眠时间/周期的单位?WinAPI C++

问题描述

我需要两种方式的分析功能。第一个是代码花费的总时间,第二个是一个不依赖于 cpu-freq 并在代码中休眠的单元。(我们的软件需要使用自己的语言/解释器进行分析,它在 Windows 上运行)

我的问题是第二个。

我想做什么有可能吗?还是有其他方法?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

标签: c++debuggingwinapiprofiling

解决方案


推荐阅读