diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2017-10-12 08:51:56 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-12 08:51:56 -0700 |
commit | cba9a0c6def70549046f1afa6a80e38fe706520e (patch) | |
tree | 1700dda3a2a2170cc5d0766387fe6f020540c44c /Python | |
parent | 0e61e67a57deb4abc677808201d7cf3c38138e02 (diff) | |
download | cpython-git-cba9a0c6def70549046f1afa6a80e38fe706520e.tar.gz |
bpo-31773: time.perf_counter() uses again double (GH-3964)
time.clock() and time.perf_counter() now use again C double
internally.
Remove also _PyTime_GetWinPerfCounterWithInfo(): use
_PyTime_GetPerfCounterDoubleWithInfo() instead on Windows.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/import.c | 12 | ||||
-rw-r--r-- | Python/pytime.c | 36 |
2 files changed, 27 insertions, 21 deletions
diff --git a/Python/import.c b/Python/import.c index d396b4de79..76aa912dc8 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1669,10 +1669,10 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, else { static int ximporttime = 0; static int import_level; - static _PyTime_t accumulated; + static double accumulated; _Py_IDENTIFIER(importtime); - _PyTime_t t1 = 0, accumulated_copy = accumulated; + double t1 = 0, accumulated_copy = accumulated; Py_XDECREF(mod); @@ -1695,7 +1695,7 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, if (ximporttime) { import_level++; - t1 = _PyTime_GetPerfCounter(); + t1 = _PyTime_GetPerfCounterDouble(); accumulated = 0; } @@ -1711,12 +1711,12 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, mod != NULL); if (ximporttime) { - _PyTime_t cum = _PyTime_GetPerfCounter() - t1; + double cum = _PyTime_GetPerfCounterDouble() - t1; import_level--; fprintf(stderr, "import time: %9ld | %10ld | %*s%s\n", - (long)_PyTime_AsMicroseconds(cum - accumulated, _PyTime_ROUND_CEILING), - (long)_PyTime_AsMicroseconds(cum, _PyTime_ROUND_CEILING), + (long)ceil((cum - accumulated) * 1e6), + (long)ceil(cum * 1e6), import_level*2, "", PyUnicode_AsUTF8(abs_name)); accumulated = accumulated_copy + cum; diff --git a/Python/pytime.c b/Python/pytime.c index dbf1dda4a0..7fd2a90f3b 100644 --- a/Python/pytime.c +++ b/Python/pytime.c @@ -801,8 +801,8 @@ _PyTime_GetMonotonicClockWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) #ifdef MS_WINDOWS -int -_PyTime_GetWinPerfCounterWithInfo(_PyTime_t *t, _Py_clock_info_t *info) +static int +win_perf_counter(double *tp, _Py_clock_info_t *info) { static LONGLONG cpu_frequency = 0; static LONGLONG ctrStart; @@ -829,28 +829,33 @@ _PyTime_GetWinPerfCounterWithInfo(_PyTime_t *t, _Py_clock_info_t *info) } diff = diff / (double)cpu_frequency; - return _PyTime_FromDouble(t, diff, _PyTime_ROUND_FLOOR, SEC_TO_NS); + *tp = diff; + return 0; } #endif int -_PyTime_GetPerfCounterWithInfo(_PyTime_t *t, _Py_clock_info_t *info) +_PyTime_GetPerfCounterDoubleWithInfo(double *d, _Py_clock_info_t *info) { #ifdef MS_WINDOWS - return _PyTime_GetWinPerfCounterWithInfo(t, info); + return win_perf_counter(d, info); #else - return _PyTime_GetMonotonicClockWithInfo(t, info); + _PyTime_t t; + if (_PyTime_GetMonotonicClockWithInfo(&t, info) < 0) { + return -1; + } + *d = _PyTime_AsSecondsDouble(t); + return 0; #endif } -_PyTime_t -_PyTime_GetPerfCounter(void) +double +_PyTime_GetPerfCounterDouble(void) { - _PyTime_t t; - if (_PyTime_GetPerfCounterWithInfo(&t, NULL) < 0) { - /* should not happen, _PyTime_Init() checked the clock at startup */ + double t; + if (_PyTime_GetPerfCounterDoubleWithInfo(&t, NULL)) { Py_UNREACHABLE(); } return t; @@ -860,17 +865,18 @@ _PyTime_GetPerfCounter(void) int _PyTime_Init(void) { - /* check that the 3 most important clocks are working properly - to not have to check for exceptions at runtime. If a clock works once, - it cannot fail in next calls. */ + /* check that time.time(), time.monotonic() and time.perf_counter() clocks + are working properly to not have to check for exceptions at runtime. If + a clock works once, it cannot fail in next calls. */ _PyTime_t t; + double d; if (_PyTime_GetSystemClockWithInfo(&t, NULL) < 0) { return -1; } if (_PyTime_GetMonotonicClockWithInfo(&t, NULL) < 0) { return -1; } - if (_PyTime_GetPerfCounterWithInfo(&t, NULL) < 0) { + if (_PyTime_GetPerfCounterDoubleWithInfo(&d, NULL) < 0) { return -1; } return 0; |