mirror of https://github.com/python/cpython
Close #10278: Add time.wallclock() function, monotonic clock.
This commit is contained in:
parent
25d1bdc407
commit
b94b266cfc
|
@ -183,6 +183,18 @@ The module defines the following functions and data items:
|
||||||
|
|
||||||
.. versionadded:: 3.3
|
.. versionadded:: 3.3
|
||||||
|
|
||||||
|
.. function:: wallclock()
|
||||||
|
|
||||||
|
.. index::
|
||||||
|
single: Wallclock
|
||||||
|
single: benchmarking
|
||||||
|
|
||||||
|
Return the current time in fractions of a second to the system's best ability.
|
||||||
|
Use this when the most accurate representation of wall-clock is required, i.e.
|
||||||
|
when "processor time" is inappropriate. The reference point of the returned
|
||||||
|
value is undefined so only the difference of consecutive calls is valid.
|
||||||
|
|
||||||
|
.. versionadded: 3.3
|
||||||
|
|
||||||
.. function:: ctime([secs])
|
.. function:: ctime([secs])
|
||||||
|
|
||||||
|
|
|
@ -396,12 +396,14 @@ New module: :mod:`faulthandler`.
|
||||||
time
|
time
|
||||||
----
|
----
|
||||||
|
|
||||||
* The :mod:`time` module has new :func:`~time.clock_getres` and
|
The :mod:`time` module has new functions:
|
||||||
:func:`~time.clock_gettime` functions and ``CLOCK_xxx`` constants.
|
|
||||||
:func:`~time.clock_gettime` can be used with :data:`time.CLOCK_MONOTONIC` to
|
|
||||||
get a monotonic clock.
|
|
||||||
|
|
||||||
(Contributed by Victor Stinner in :issue:`10278`)
|
* :func:`~time.clock_getres` and :func:`~time.clock_gettime` functions and
|
||||||
|
``CLOCK_xxx`` constants. :func:`~time.clock_gettime` can be used with
|
||||||
|
:data:`time.CLOCK_MONOTONIC` to get a monotonic clock.
|
||||||
|
* :func:`~time.wallclock`: monotonic clock.
|
||||||
|
|
||||||
|
(Contributed by Victor Stinner in :issue:`10278`)
|
||||||
|
|
||||||
|
|
||||||
ftplib
|
ftplib
|
||||||
|
|
|
@ -332,6 +332,13 @@ class TimeTestCase(unittest.TestCase):
|
||||||
self.assertEqual(time.strftime('%Z', tt), tzname)
|
self.assertEqual(time.strftime('%Z', tt), tzname)
|
||||||
|
|
||||||
|
|
||||||
|
def test_wallclock(self):
|
||||||
|
t0 = time.wallclock()
|
||||||
|
time.sleep(0.1)
|
||||||
|
t1 = time.wallclock()
|
||||||
|
t = t1 - t0
|
||||||
|
self.assertAlmostEqual(t, 0.1, places=2)
|
||||||
|
|
||||||
class TestLocale(unittest.TestCase):
|
class TestLocale(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.oldloc = locale.setlocale(locale.LC_ALL)
|
self.oldloc = locale.setlocale(locale.LC_ALL)
|
||||||
|
|
|
@ -447,6 +447,8 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #10278: Add time.wallclock() function, monotonic clock.
|
||||||
|
|
||||||
- Issue #13809: Fix regression where bz2 module wouldn't work when threads are
|
- Issue #13809: Fix regression where bz2 module wouldn't work when threads are
|
||||||
disabled. Original patch by Amaury Forgeot d'Arc.
|
disabled. Original patch by Amaury Forgeot d'Arc.
|
||||||
|
|
||||||
|
|
|
@ -733,6 +733,52 @@ the local timezone used by methods such as localtime, but this behaviour\n\
|
||||||
should not be relied on.");
|
should not be relied on.");
|
||||||
#endif /* HAVE_WORKING_TZSET */
|
#endif /* HAVE_WORKING_TZSET */
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
time_wallclock(PyObject *self, PyObject *unused)
|
||||||
|
{
|
||||||
|
#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
|
||||||
|
return time_clock(self, NULL);
|
||||||
|
#elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
|
||||||
|
static int clk_index = 0;
|
||||||
|
clockid_t clk_ids[] = {
|
||||||
|
#ifdef CLOCK_MONOTONIC_RAW
|
||||||
|
CLOCK_MONOTONIC_RAW,
|
||||||
|
#endif
|
||||||
|
CLOCK_MONOTONIC
|
||||||
|
#ifdef CLOCK_REALTIME
|
||||||
|
/* On Linux, CLOCK_REALTIME uses the same clock than gettimeofday(),
|
||||||
|
but clock_gettime() has a nanosecond resolution. */
|
||||||
|
, CLOCK_REALTIME
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
int ret;
|
||||||
|
struct timespec tp;
|
||||||
|
|
||||||
|
while (0 <= clk_index) {
|
||||||
|
clockid_t clk_id = clk_ids[clk_index];
|
||||||
|
ret = clock_gettime(clk_id, &tp);
|
||||||
|
if (ret == 0)
|
||||||
|
return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
|
||||||
|
|
||||||
|
clk_index++;
|
||||||
|
if (Py_ARRAY_LENGTH(clk_ids) <= clk_index)
|
||||||
|
clk_index = -1;
|
||||||
|
}
|
||||||
|
return time_time(self, NULL);
|
||||||
|
#else
|
||||||
|
return time_time(self, NULL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
PyDoc_STRVAR(wallclock_doc,
|
||||||
|
"wallclock() -> float\n\
|
||||||
|
\n\
|
||||||
|
Return the current time in fractions of a second to the system's best\n\
|
||||||
|
ability. Use this when the most accurate representation of wall-clock is\n\
|
||||||
|
required, i.e. when "processor time" is inappropriate. The reference point\n\
|
||||||
|
of the returned value is undefined so only the difference of consecutive\n\
|
||||||
|
calls is valid.");
|
||||||
|
|
||||||
static void
|
static void
|
||||||
PyInit_timezone(PyObject *m) {
|
PyInit_timezone(PyObject *m) {
|
||||||
/* This code moved from PyInit_time wholesale to allow calling it from
|
/* This code moved from PyInit_time wholesale to allow calling it from
|
||||||
|
@ -868,6 +914,7 @@ static PyMethodDef time_methods[] = {
|
||||||
#ifdef HAVE_WORKING_TZSET
|
#ifdef HAVE_WORKING_TZSET
|
||||||
{"tzset", time_tzset, METH_NOARGS, tzset_doc},
|
{"tzset", time_tzset, METH_NOARGS, tzset_doc},
|
||||||
#endif
|
#endif
|
||||||
|
{"wallclock", time_wallclock, METH_NOARGS, wallclock_doc},
|
||||||
{NULL, NULL} /* sentinel */
|
{NULL, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue