Kaydet (Commit) 09225b73 authored tarafından Victor Stinner's avatar Victor Stinner

Issue #13845: time.time() now uses GetSystemTimeAsFileTime() instead of ftime()

to have a resolution of 100 ns instead of 1 ms (the clock accuracy is between
0.5 ms and 15 ms).
üst 8b30201f
...@@ -466,6 +466,10 @@ Core and Builtins ...@@ -466,6 +466,10 @@ Core and Builtins
Library Library
------- -------
- Issue #13845: time.time() now uses GetSystemTimeAsFileTime() instead of
ftime() to have a resolution of 100 ns instead of 1 ms (the clock accuracy is
between 0.5 ms and 15 ms).
- Issue #13846: Add time.monotonic(), monotonic clock. - Issue #13846: Add time.monotonic(), monotonic clock.
- Issue #10811: Fix recursive usage of cursors. Instead of crashing, - Issue #10811: Fix recursive usage of cursors. Instead of crashing,
......
#include "Python.h" #include "Python.h"
#ifdef MS_WINDOWS
#include <windows.h>
#endif
#ifdef __APPLE__ #if defined(__APPLE__) && defined(HAVE_GETTIMEOFDAY) && defined(HAVE_FTIME)
#if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_FTIME)
/* /*
* _PyTime_gettimeofday falls back to ftime when getttimeofday fails because the latter * _PyTime_gettimeofday falls back to ftime when getttimeofday fails because the latter
* might fail on some platforms. This fallback is unwanted on MacOSX because * might fail on some platforms. This fallback is unwanted on MacOSX because
...@@ -10,18 +12,30 @@ ...@@ -10,18 +12,30 @@
*/ */
# undef HAVE_FTIME # undef HAVE_FTIME
#endif #endif
#endif
#ifdef HAVE_FTIME #if defined(HAVE_FTIME) && !defined(MS_WINDOWS)
#include <sys/timeb.h> #include <sys/timeb.h>
#if !defined(MS_WINDOWS) && !defined(PYOS_OS2)
extern int ftime(struct timeb *); extern int ftime(struct timeb *);
#endif /* MS_WINDOWS */ #endif
#endif /* HAVE_FTIME */
void void
_PyTime_gettimeofday(_PyTime_timeval *tp) _PyTime_gettimeofday(_PyTime_timeval *tp)
{ {
#ifdef MS_WINDOWS
FILETIME system_time;
ULARGE_INTEGER large;
ULONGLONG microseconds;
GetSystemTimeAsFileTime(&system_time);
large.u.LowPart = system_time.dwLowDateTime;
large.u.HighPart = system_time.dwHighDateTime;
/* 11,644,473,600,000,000: number of microseconds between
the 1st january 1601 and the 1st january 1970 (369 years + 89 leap
days). */
microseconds = large.QuadPart / 10 - 11644473600000000;
tp->tv_sec = microseconds / 1000000;
tp->tv_usec = microseconds % 1000000;
#else
/* There are three ways to get the time: /* There are three ways to get the time:
(1) gettimeofday() -- resolution in microseconds (1) gettimeofday() -- resolution in microseconds
(2) ftime() -- resolution in milliseconds (2) ftime() -- resolution in milliseconds
...@@ -30,6 +44,7 @@ _PyTime_gettimeofday(_PyTime_timeval *tp) ...@@ -30,6 +44,7 @@ _PyTime_gettimeofday(_PyTime_timeval *tp)
Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
fail, so we fall back on ftime() or time(). fail, so we fall back on ftime() or time().
Note: clock resolution does not imply clock accuracy! */ Note: clock resolution does not imply clock accuracy! */
#ifdef HAVE_GETTIMEOFDAY #ifdef HAVE_GETTIMEOFDAY
#ifdef GETTIMEOFDAY_NO_TZ #ifdef GETTIMEOFDAY_NO_TZ
if (gettimeofday(tp) == 0) if (gettimeofday(tp) == 0)
...@@ -39,6 +54,7 @@ _PyTime_gettimeofday(_PyTime_timeval *tp) ...@@ -39,6 +54,7 @@ _PyTime_gettimeofday(_PyTime_timeval *tp)
return; return;
#endif /* !GETTIMEOFDAY_NO_TZ */ #endif /* !GETTIMEOFDAY_NO_TZ */
#endif /* !HAVE_GETTIMEOFDAY */ #endif /* !HAVE_GETTIMEOFDAY */
#if defined(HAVE_FTIME) #if defined(HAVE_FTIME)
{ {
struct timeb t; struct timeb t;
...@@ -50,7 +66,8 @@ _PyTime_gettimeofday(_PyTime_timeval *tp) ...@@ -50,7 +66,8 @@ _PyTime_gettimeofday(_PyTime_timeval *tp)
tp->tv_sec = time(NULL); tp->tv_sec = time(NULL);
tp->tv_usec = 0; tp->tv_usec = 0;
#endif /* !HAVE_FTIME */ #endif /* !HAVE_FTIME */
return;
#endif /* MS_WINDOWS */
} }
void void
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment