[Python-checkins] peps: PEP 418: cleanup pseudo-code; mention clock_getcpuclockid()

victor.stinner python-checkins at python.org
Tue Apr 17 13:42:13 CEST 2012


http://hg.python.org/peps/rev/353f27792430
changeset: 4257:353f27792430
user: Victor Stinner <victor.stinner at gmail.com>
date: Tue Apr 17 13:42:05 2012 +0200
summary:
 PEP 418: cleanup pseudo-code; mention clock_getcpuclockid()
 * Write _win_perf_counter() to factorize and simplify clock() and
 process_time() pseudo-code
 * Don't use os.times() but _time.times() to not have to check for the platform
 * clock() retries QueryPerformanceCounter() each time it is called, even if
 it failed
files:
 pep-0418.txt | 65 ++++++++++++++++++---------------------
 1 files changed, 30 insertions(+), 35 deletions(-)
diff --git a/pep-0418.txt b/pep-0418.txt
--- a/pep-0418.txt
+++ b/pep-0418.txt
@@ -183,20 +183,22 @@
 
 Pseudo-code::
 
+ if os.name == 'nt':
+ def _win_perf_counter():
+ if _win_perf_counter.frequency is None:
+ _win_perf_counter.frequency = _time.QueryPerformanceFrequency()
+ return _time.QueryPerformanceCounter() / _win_perf_counter.frequency
+ _win_perf_counter.frequency = None
+
 def perf_counter():
 if perf_counter.use_performance_counter:
- if perf_counter.performance_frequency is None:
- try:
- perf_counter.performance_frequency = _time.QueryPerformanceFrequency()
- except OSError:
- # QueryPerformanceFrequency() fails if the installed
- # hardware does not support a high-resolution performance
- # counter
- perf_counter.use_performance_counter = False
- else:
- return _time.QueryPerformanceCounter() / perf_counter.performance_frequency
- else:
- return _time.QueryPerformanceCounter() / perf_counter.performance_frequency
+ try:
+ return _win_perf_counter()
+ except OSError:
+ # QueryPerformanceFrequency() fails if the installed
+ # hardware does not support a high-resolution performance
+ # counter
+ perf_counter.use_performance_counter = False
 if perf_counter.use_monotonic:
 # The monotonic clock is preferred over the system time
 try:
@@ -205,8 +207,6 @@
 perf_counter.use_monotonic = False
 return time.time()
 perf_counter.use_performance_counter = (os.name == 'nt')
- if perf_counter.use_performance_counter:
- perf_counter.performance_frequency = None
 perf_counter.use_monotonic = hasattr(time, 'monotonic')
 
 
@@ -229,7 +229,6 @@
 process_times = win32process.GetProcessTimes(handle)
 return (process_times['UserTime'] + process_times['KernelTime']) * 1e-7
 else:
- import os
 try:
 import resource
 except ImportError:
@@ -251,8 +250,9 @@
 process_time.use_getrusage = False
 if process_time.use_times:
 try:
- times = os.times()
- return times[0] + times[1]
+ times = _time.times()
+ cpu_time = times.tms_utime + times.tms_stime
+ return cpu_time / process_time.ticks_per_seconds
 except OSError:
 process_time.use_getrusage = False
 return _time.clock()
@@ -260,8 +260,10 @@
 hasattr(time, 'clock_gettime')
 and hasattr(time, 'CLOCK_PROCESS_CPUTIME_ID'))
 process_time.use_getrusage = has_resource
- # On OS/2, only the 5th field of os.times() is set, others are zeros
- process_time.use_times = (hasattr(os, 'times') and os.name != 'os2')
+ process_time.use_times = hasattr(_time, 'times')
+ if process_time.use_times:
+ # sysconf("SC_CLK_TCK"), or the HZ constant, or 60
+ process_time.ticks_per_seconds = _times.ticks_per_seconds
 
 
 Existing Functions
@@ -370,22 +372,14 @@
 
 if os.name == 'nt':
 def clock():
- if clock.use_performance_counter:
- if clock.perf_frequency is None:
- try:
- clock.perf_frequency = float(_time.QueryPerformanceFrequency())
- except OSError:
- # QueryPerformanceFrequency() fails if the installed
- # hardware does not support a high-resolution performance
- # counter
- clock.use_performance_counter = False
- else:
- return _time.QueryPerformanceCounter() / clock.perf_frequency
- else:
- return _time.QueryPerformanceCounter() / clock.perf_frequency
+ try:
+ return _win_perf_counter()
+ except OSError:
+ # QueryPerformanceFrequency() fails if the installed
+ # hardware does not support a high-resolution performance
+ # counter
+ pass
 return _time.clock()
- clock.use_performance_counter = True
- clock.perf_frequency = None
 else:
 clock = _time.clock
 
@@ -1259,7 +1253,8 @@
 
 See also the `QueryProcessCycleTime() function
 <http://msdn.microsoft.com/en-us/library/windows/desktop/ms684929(v=vs.85).aspx>`_
-(sum of the cycle time of all threads).
+(sum of the cycle time of all threads) and `clock_getcpuclockid()
+<http://www.kernel.org/doc/man-pages/online/pages/man3/clock_getcpuclockid.3.html>`_.
 
 
 Thread Time
-- 
Repository URL: http://hg.python.org/peps


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /