Мне нужна функция профилирования двумя способами. Первый - это общее время, которое тратит код, а второй - блок, который не зависит от 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