-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathMeasureSleep.cpp
44 lines (33 loc) · 1.29 KB
/
MeasureSleep.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <windows.h>
typedef NTSTATUS(CALLBACK *NTQUERYTIMERRESOLUTION)(
OUT PULONG MinimumResolution,
OUT PULONG MaximumResolution,
OUT PULONG CurrentResolutionolution);
int main() {
ULONG MinimumResolution, MaximumResolution, CurrentResolution;
LARGE_INTEGER start, end, freq;
QueryPerformanceFrequency(&freq);
HMODULE hNtDll = LoadLibrary(L"NtDll.dll");
if (!hNtDll) {
printf("LoadLibrary failed");
return 1;
}
NTQUERYTIMERRESOLUTION NtQueryTimerResolution = (NTQUERYTIMERRESOLUTION)GetProcAddress(hNtDll, "NtQueryTimerResolution");
for (;;) {
// get current resolution
if (NtQueryTimerResolution(&MinimumResolution, &MaximumResolution, &CurrentResolution)) {
printf("NtQueryTimerResolution failed");
return 1;
}
// benchmark Sleep(1)
QueryPerformanceCounter(&start);
Sleep(1);
QueryPerformanceCounter(&end);
double delta_s = (double)(end.QuadPart - start.QuadPart) / freq.QuadPart;
double delta_ms = delta_s * 1000;
printf("Resolution: %lfms, Sleep(1) slept %lfms (delta: %lf)\n",
CurrentResolution / 10000.0, delta_ms, delta_ms - 1);
Sleep(1000); // pause for a second between iterations
}
}