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).
This commit is contained in:
Victor Stinner 2012-02-07 23:41:01 +01:00
parent 8b30201f7d
commit 09225b73c1
2 changed files with 29 additions and 8 deletions

View file

@ -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,

View file

@ -1,7 +1,9 @@
#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 @@
*/ */
# 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)
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)
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)
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