Измерение циклов процессора или другой единицы измерения, которая не зависит от частоты процессора и не учитывает время / циклы в режиме сна? WinAPI C ++ - PullRequest
2 голосов
/ 16 октября 2019

Мне нужна функция профилирования двумя способами. Первый - это общее время, которое тратит код, а второй - блок, который не зависит от cpu-freq и спит в коде. (Профилирование необходимо для нашего программного обеспечения с собственным языком / переводчиком, оно работает в Windows)

Моя проблема со вторым.

Возможно ли то, что я хочу сделать? или есть другой способ? Как / что делает визуальное профилирование в студии?

Примечание: я знаю, что мой вопрос выглядит как дубликат. Я пытался прокомментировать некоторые старые ответы на те же вопросы (например: Другой вопрос ), чтобы получить лучшие ответы, но мои комментарии удаляются через 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

...