You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Windows] time.sleep() should use CREATE_WAITABLE_TIMER_HIGH_RESOLUTION #89592
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee=Noneclosed_at=<Date2021-11-18.06:26:34.313>created_at=<Date2021-10-11.08:28:27.791>labels= ['type-feature', 'library', 'OS-windows', '3.11']
title='[Windows] time.sleep() should use CREATE_WAITABLE_TIMER_HIGH_RESOLUTION'updated_at=<Date2021-11-18.06:26:34.312>user='https://github.com/vstinner'
The Go programming language called timeBeginPeriod(1) to get more accurate timers. With the following change, it can now use a high resolution timer (CREATE_WAITABLE_TIMER_HIGH_RESOLUTION) to sleep: https://go-review.googlesource.com/c/go/+/248699/
It's up to the core devs whether or not Python should try to use a high-resolution timer, which is currently undocumented in the Windows API and implemented only in recent releases of Windows 10 and 11. But if this does get supported, the code should fall back on creating a normal timer if CREATE_WAITABLE_TIMER_HIGH_RESOLUTION makes the call fail. For example:
LARGE_INTEGER relative_timeout;
// No need to check for integer overflow, both types are signed
assert(sizeof(relative_timeout) == sizeof(timeout_100ns));
// SetWaitableTimerEx(): a negative due time is relative
relative_timeout.QuadPart = -timeout_100ns;
DWORD flags = CREATE_WAITABLE_TIMER_HIGH_RESOLUTION;
create_timer:
HANDLEtimer=CreateWaitableTimerExW(NULL, NULL, flags, TIMER_ALL_ACCESS);
if (timer==NULL)
{
if (flags&&GetLastError() ==ERROR_INVALID_PARAMETER) {
// CREATE_WAITABLE_TIMER_HIGH_RESOLUTION is not supported.flags=0;
goto create_timer;
}
PyErr_SetFromWindowsErr(0);
return-1;
}
if (!SetWaitableTimerEx(timer, &relative_timeout,
0, // no period; the timer is signaled onceNULL, NULL, // no completion routineNULL, // no wake context; do not resume from suspend0)) // no tolerable delay for timer coalescing
{
PyErr_SetFromWindowsErr(0);
goto error;
}
Livius90 commented on Oct 23, 2021
Livius90mannequin
Mannequin
More actions
A similar solution was introduced in VirtualBox some months ago. Soon, i could get back my Windows 10 developing PC and i can try this things.
Activity
vstinner commentedon Oct 11, 2021
In bpo-21302, the Windows implementation of time.sleep() was modified to use a waitable timer:
New changeset 58f8adf by Victor Stinner in branch 'main':
bpo-21302: time.sleep() uses waitable timer on Windows (GH-28483)
58f8adf
It now calls the functions:
While SetWaitableTimer() has a resolution of 100 ns, the timer has a resolution of 15.6 ms in practice.
We could use the undocumented CREATE_WAITABLE_TIMER_HIGH_RESOLUTION flag with CreateWaitableTimerEx(). See: https://bugs.python.org/issue21302#msg403550
See also:
vstinner commentedon Oct 11, 2021
See also: https://groups.google.com/a/chromium.org/g/scheduler-dev/c/0GlSPYreJeY
vstinner commentedon Oct 11, 2021
The Go programming language called timeBeginPeriod(1) to get more accurate timers. With the following change, it can now use a high resolution timer (CREATE_WAITABLE_TIMER_HIGH_RESOLUTION) to sleep:
https://go-review.googlesource.com/c/go/+/248699/
vstinner commentedon Oct 11, 2021
See also bpo-19007: "precise time.time() under Windows 8: use GetSystemTimePreciseAsFileTime".
eryksun commentedon Oct 11, 2021
It's up to the core devs whether or not Python should try to use a high-resolution timer, which is currently undocumented in the Windows API and implemented only in recent releases of Windows 10 and 11. But if this does get supported, the code should fall back on creating a normal timer if CREATE_WAITABLE_TIMER_HIGH_RESOLUTION makes the call fail. For example:
Livius90 commentedon Oct 23, 2021
A similar solution was introduced in VirtualBox some months ago. Soon, i could get back my Windows 10 developing PC and i can try this things.
https://www.virtualbox.org/browser/vbox/trunk/src/VBox/Runtime/r3/win/timer-win.cpp#L312
corona10 commentedon Oct 24, 2021
AS-IS:
average: 0.015609736680984497
TO-BE:
average: 2.7387380599975585e-05
Impressive result :)
corona10 commentedon Nov 16, 2021
New changeset 55868f1 by Dong-hee Na in branch 'main':
bpo-45429: Support CREATE_WAITABLE_TIMER_HIGH_RESOLUTION if possible (GH-29203)
55868f1
ambv commentedon Nov 18, 2021
New changeset fc4474e by Dong-hee Na in branch 'main':
bpo-45429: Merge whatsnew about time.sleep (GH-29589)
fc4474e
Livius90 commentedon Nov 12, 2022
some test-run:
#65501 (comment)