changeset: 97174:917cebba8cb9 tag: tip user: Victor Stinner date: Fri Jul 31 23:46:07 2015 +0200 files: Doc/library/time.rst Doc/whatsnew/3.6.rst Python/pytime.c description: Use GetSystemTimePreciseAsFileTime On Windows, time.time() now uses GetSystemTimePreciseAsFileTime() when available: Windows 8, Windows Server 2012 and newer. diff -r 74fc1af57c72 -r 917cebba8cb9 Doc/library/time.rst --- a/Doc/library/time.rst Fri Jul 31 23:36:28 2015 +0200 +++ b/Doc/library/time.rst Fri Jul 31 23:46:07 2015 +0200 @@ -576,6 +576,11 @@ The module defines the following functio lower value than a previous call if the system clock has been set back between the two calls. + .. versionchanged:: 3.6 + On Windows, the ``GetSystemTimePreciseAsFileTime()`` C function is now + used when available: Windows 8, Windows Server 2012 and newer. + + .. data:: timezone The offset of the local (non-DST) timezone, in seconds west of UTC (negative in diff -r 74fc1af57c72 -r 917cebba8cb9 Doc/whatsnew/3.6.rst --- a/Doc/whatsnew/3.6.rst Fri Jul 31 23:36:28 2015 +0200 +++ b/Doc/whatsnew/3.6.rst Fri Jul 31 23:46:07 2015 +0200 @@ -95,7 +95,12 @@ New Modules Improved Modules ================ -* None yet. +time +---- + +* On Windows, :func:`time.time` now uses the + ``GetSystemTimePreciseAsFileTime()`` C function when available: Windows 8, + Windows Server 2012 and newer. Optimizations diff -r 74fc1af57c72 -r 917cebba8cb9 Python/pytime.c --- a/Python/pytime.c Fri Jul 31 23:36:28 2015 +0200 +++ b/Python/pytime.c Fri Jul 31 23:46:07 2015 +0200 @@ -23,6 +23,10 @@ #define NS_TO_MS (1000 * 1000) #define NS_TO_US (1000) +#ifdef MS_WINDOWS +static VOID (CALLBACK *Py_GetSystemTimePreciseAsFileTime)(LPFILETIME) = NULL; +#endif + static void error_time_t_overflow(void) { @@ -429,7 +433,10 @@ pygettimeofday_new(_PyTime_t *tp, _Py_cl assert(info == NULL || raise); - GetSystemTimeAsFileTime(&system_time); + if (Py_GetSystemTimePreciseAsFileTime) + Py_GetSystemTimePreciseAsFileTime(&system_time); + else + GetSystemTimeAsFileTime(&system_time); large.u.LowPart = system_time.dwLowDateTime; large.u.HighPart = system_time.dwHighDateTime; /* 11,644,473,600,000,000,000: number of nanoseconds between @@ -440,16 +447,32 @@ pygettimeofday_new(_PyTime_t *tp, _Py_cl DWORD timeAdjustment, timeIncrement; BOOL isTimeAdjustmentDisabled, ok; - info->implementation = "GetSystemTimeAsFileTime()"; - info->monotonic = 0; - ok = GetSystemTimeAdjustment(&timeAdjustment, &timeIncrement, - &isTimeAdjustmentDisabled); - if (!ok) { - PyErr_SetFromWindowsErr(0); - return -1; + if (Py_GetSystemTimePreciseAsFileTime) { + LARGE_INTEGER freq; + + info->implementation = "GetSystemTimePreciseAsFileTime()"; + info->monotonic = 0; + ok = GetSystemTimeAdjustment(&timeAdjustment, &timeIncrement, + &isTimeAdjustmentDisabled); + if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) { + PyErr_SetFromWindowsErr(0); + return -1; + } + info->resolution = 1.0 / (double)freq.QuadPart; + info->adjustable = 1; } - info->resolution = timeIncrement * 1e-7; - info->adjustable = 1; + else { + info->implementation = "GetSystemTimeAsFileTime()"; + info->monotonic = 0; + ok = GetSystemTimeAdjustment(&timeAdjustment, &timeIncrement, + &isTimeAdjustmentDisabled); + if (!ok) { + PyErr_SetFromWindowsErr(0); + return -1; + } + info->resolution = timeIncrement * 1e-7; + info->adjustable = 1; + } } #else /* MS_WINDOWS */ @@ -662,6 +685,14 @@ int _PyTime_Init(void) { _PyTime_t t; +#ifdef MS_WINDOWS + HINSTANCE hKernel32; + + hKernel32 = GetModuleHandleW(L"KERNEL32"); + /* Function available on Windows 8, Windows Server 2012 and newer */ + *(FARPROC*)&Py_GetSystemTimePreciseAsFileTime = GetProcAddress(hKernel32, + "GetSystemTimePreciseAsFileTime"); +#endif /* ensure that the system clock works */ if (_PyTime_GetSystemClockWithInfo(&t, NULL) < 0)