MeasureSleep
is used to measure the precision of Sleep(n). By default, it sits in an infinite loop measuring the sleep deltas, but you can use the --samples
argument to get average and STDEV metrics.
SetTimerResolution
is used to request a higher resolution by calling NtSetTimerResolution. As an example to automatically start a hidden instance of the program when the system starts and raise the resolution to 0.5ms, place the binary somewhere safe and create a scheduled task in task scheduler (instructions) with the command below as an example.
C:SetTimerResolution.exe --resolution 5000 --no-console
According to a comment on the Great Rule Change article, on Windows Server 2022+ and Windows 11+, the registry key below can also be used so that requesting a higher resolution is effective on a system-wide level rather than only the calling process. This should only be used for debugging purposes.
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession Managerkernel]
"GlobalTimerResolutionRequests"=dword:00000001
The micro-adjust-benchmark.ps1 script can be used to automate the process of plotting precision against resolutions. The results can be visualized with chart-studio.plotly.com.
git clone https://github.com/valleyofdoom/TimerResolution.git
cd .TimerResolution
# x64
$env:VCPKG_DEFAULT_TRIPLET = "x64-windows"
# install dependencies
vcpkg install
# replace "SetTimerResolution" with "MeasureSleep" if desired
MSBuild.exe .TimerResolution.sln -p:Configuration=Release -p:Platform=x64 -t:SetTimerResolution