diff options
author | Chris Eibl <138194463+chris-eibl@users.noreply.github.com> | 2025-04-28 13:55:08 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-28 13:55:08 +0200 |
commit | 11f457cf41beede182d7387080f35c73f8f4a46f (patch) | |
tree | 6f9070bc3b9fd0e3fe899ee5b9cdc700e0e14671 | |
parent | e577439803db15122af9b080103a5819cd38272f (diff) | |
download | cpython-11f457cf41beede182d7387080f35c73f8f4a46f.tar.gz cpython-11f457cf41beede182d7387080f35c73f8f4a46f.zip |
GH-114911: use time.perf_counter in Stopwatch (GH-131469)
Co-authored-by: Petr Viktorin <encukou@gmail.com>
Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
-rw-r--r-- | Lib/test/support/__init__.py | 24 | ||||
-rw-r--r-- | Lib/test/test_int.py | 12 | ||||
-rw-r--r-- | Lib/test/test_re.py | 4 |
3 files changed, 20 insertions, 20 deletions
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 146cbaaf4cb..82f88109498 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -2586,30 +2586,30 @@ def sleeping_retry(timeout, err_msg=None, /, delay = min(delay * 2, max_delay) -class CPUStopwatch: +class Stopwatch: """Context manager to roughly time a CPU-bound operation. - Disables GC. Uses CPU time if it can (i.e. excludes sleeps & time of - other processes). + Disables GC. Uses perf_counter, which is a clock with the highest + available resolution. It is chosen even though it does include + time elapsed during sleep and is system-wide, because the + resolution of process_time is too coarse on Windows and + process_time does not exist everywhere (for example, WASM). - N.B.: - - This *includes* time spent in other threads. + Note: + - This *includes* time spent in other threads/processes. - Some systems only have a coarse resolution; check - stopwatch.clock_info.rseolution if. + stopwatch.clock_info.resolution when using the results. Usage: - with ProcessStopwatch() as stopwatch: + with Stopwatch() as stopwatch: ... elapsed = stopwatch.seconds resolution = stopwatch.clock_info.resolution """ def __enter__(self): - get_time = time.process_time - clock_info = time.get_clock_info('process_time') - if get_time() <= 0: # some platforms like WASM lack process_time() - get_time = time.monotonic - clock_info = time.get_clock_info('monotonic') + get_time = time.perf_counter + clock_info = time.get_clock_info('perf_counter') self.context = disable_gc() self.context.__enter__() self.get_time = get_time diff --git a/Lib/test/test_int.py b/Lib/test/test_int.py index d1bf847a7a3..245528ce57a 100644 --- a/Lib/test/test_int.py +++ b/Lib/test/test_int.py @@ -590,7 +590,7 @@ class IntStrDigitLimitsTests(unittest.TestCase): digits = 78_268 with ( support.adjust_int_max_str_digits(digits), - support.CPUStopwatch() as sw_convert): + support.Stopwatch() as sw_convert): huge_decimal = str(huge_int) self.assertEqual(len(huge_decimal), digits) # Ensuring that we chose a slow enough conversion to measure. @@ -605,7 +605,7 @@ class IntStrDigitLimitsTests(unittest.TestCase): with support.adjust_int_max_str_digits(int(.995 * digits)): with ( self.assertRaises(ValueError) as err, - support.CPUStopwatch() as sw_fail_huge): + support.Stopwatch() as sw_fail_huge): str(huge_int) self.assertIn('conversion', str(err.exception)) self.assertLessEqual(sw_fail_huge.seconds, sw_convert.seconds/2) @@ -615,7 +615,7 @@ class IntStrDigitLimitsTests(unittest.TestCase): extra_huge_int = int(f'0x{"c"*500_000}', base=16) # 602060 digits. with ( self.assertRaises(ValueError) as err, - support.CPUStopwatch() as sw_fail_extra_huge): + support.Stopwatch() as sw_fail_extra_huge): # If not limited, 8 seconds said Zen based cloud VM. str(extra_huge_int) self.assertIn('conversion', str(err.exception)) @@ -630,7 +630,7 @@ class IntStrDigitLimitsTests(unittest.TestCase): huge = '8'*digits with ( support.adjust_int_max_str_digits(digits), - support.CPUStopwatch() as sw_convert): + support.Stopwatch() as sw_convert): int(huge) # Ensuring that we chose a slow enough conversion to measure. # It takes 0.1 seconds on a Zen based cloud VM in an opt build. @@ -642,7 +642,7 @@ class IntStrDigitLimitsTests(unittest.TestCase): with support.adjust_int_max_str_digits(digits - 1): with ( self.assertRaises(ValueError) as err, - support.CPUStopwatch() as sw_fail_huge): + support.Stopwatch() as sw_fail_huge): int(huge) self.assertIn('conversion', str(err.exception)) self.assertLessEqual(sw_fail_huge.seconds, sw_convert.seconds/2) @@ -652,7 +652,7 @@ class IntStrDigitLimitsTests(unittest.TestCase): extra_huge = '7'*1_200_000 with ( self.assertRaises(ValueError) as err, - support.CPUStopwatch() as sw_fail_extra_huge): + support.Stopwatch() as sw_fail_extra_huge): # If not limited, 8 seconds in the Zen based cloud VM. int(extra_huge) self.assertIn('conversion', str(err.exception)) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index f65b4076aee..cf8525ed901 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1,7 +1,7 @@ from test.support import (gc_collect, bigmemtest, _2G, cpython_only, captured_stdout, check_disallow_instantiation, linked_to_musl, - warnings_helper, SHORT_TIMEOUT, CPUStopwatch, requires_resource) + warnings_helper, SHORT_TIMEOUT, Stopwatch, requires_resource) import locale import re import string @@ -2467,7 +2467,7 @@ class ReTests(unittest.TestCase): @requires_resource('cpu') def test_search_anchor_at_beginning(self): s = 'x'*10**7 - with CPUStopwatch() as stopwatch: + with Stopwatch() as stopwatch: for p in r'\Ay', r'^y': self.assertIsNone(re.search(p, s)) self.assertEqual(re.split(p, s), [s]) |