summaryrefslogtreecommitdiff
path: root/Lib/profile.py
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2001-10-09 20:51:19 +0000
committerTim Peters <tim.peters@gmail.com>2001-10-09 20:51:19 +0000
commit659a60311d9c09a5fbedbfcfd54fd8d5ff1ce562 (patch)
treeae45a65e49edb5d788cf742a7e7cd0f367a6ce96 /Lib/profile.py
parent12b22ff6d70cde60c49721f1ba8b88f47a9b4343 (diff)
downloadcpython-git-659a60311d9c09a5fbedbfcfd54fd8d5ff1ce562.tar.gz
Allow the profiler's calibration constant to be specified in the constructor
call, or via setting an instance or class vrbl. Rewrote the calibration docs. Modern boxes are so friggin' fast, and a profiler event does so much work anyway, that the cost of looking up an instance vrbl (the bias constant) per profile event just isn't a big deal.
Diffstat (limited to 'Lib/profile.py')
-rwxr-xr-xLib/profile.py46
1 files changed, 27 insertions, 19 deletions
diff --git a/Lib/profile.py b/Lib/profile.py
index 6c1edea2f7..db4079093e 100755
--- a/Lib/profile.py
+++ b/Lib/profile.py
@@ -139,11 +139,17 @@ class Profile:
it was called by us.
"""
- def __init__(self, timer=None):
+ bias = 0 # calibration constant
+
+ def __init__(self, timer=None, bias=None):
self.timings = {}
self.cur = None
self.cmd = ""
+ if bias is None:
+ bias = self.bias
+ self.bias = bias # Materialize in local dict for lookup speed.
+
if not timer:
if os.name == 'mac':
self.timer = MacOS.GetTicks
@@ -190,7 +196,7 @@ class Profile:
def trace_dispatch(self, frame, event, arg):
timer = self.timer
t = timer()
- t = t[0] + t[1] - self.t # - .00053 calibration constant
+ t = t[0] + t[1] - self.t - self.bias
if self.dispatch[event](self, frame,t):
t = timer()
@@ -198,45 +204,39 @@ class Profile:
else:
r = timer()
self.t = r[0] + r[1] - t # put back unrecorded delta
- return
-
# Dispatch routine for best timer program (return = scalar, fastest if
# an integer but float works too -- and time.clock() relies on that).
def trace_dispatch_i(self, frame, event, arg):
timer = self.timer
- t = timer() - self.t # - 16e-6 # calibration constant
+ t = timer() - self.t - self.bias
if self.dispatch[event](self, frame,t):
self.t = timer()
else:
self.t = timer() - t # put back unrecorded delta
- return
# Dispatch routine for macintosh (timer returns time in ticks of
# 1/60th second)
def trace_dispatch_mac(self, frame, event, arg):
timer = self.timer
- t = timer()/60.0 - self.t # - 1 # calibration constant
- if self.dispatch[event](self, frame,t):
+ t = timer()/60.0 - self.t - self.bias
+ if self.dispatch[event](self, frame, t):
self.t = timer()/60.0
else:
self.t = timer()/60.0 - t # put back unrecorded delta
- return
-
# SLOW generic dispatch routine for timer returning lists of numbers
def trace_dispatch_l(self, frame, event, arg):
get_time = self.get_time
- t = get_time() - self.t
+ t = get_time() - self.t - self.bias
- if self.dispatch[event](self, frame,t):
+ if self.dispatch[event](self, frame, t):
self.t = get_time()
else:
self.t = get_time() - t # put back unrecorded delta
- return
# In the event handlers, the first 3 elements of self.cur are unpacked
# into vrbls w/ 3-letter names. The last two characters are meant to be
@@ -430,9 +430,9 @@ class Profile:
# Similarly, there is a delay from the time that the profiler
# re-starts the stopwatch before the user's code really gets to
# continue. The following code tries to measure the difference on
- # a per-event basis. The result can the be placed in the
- # Profile.dispatch_event() routine for the given platform. Note
- # that this difference is only significant if there are a lot of
+ # a per-event basis.
+ #
+ # Note that this difference is only significant if there are a lot of
# events, and relatively little user code per event. For example,
# code with small functions will typically benefit from having the
# profiler calibrated for the current platform. This *could* be
@@ -461,12 +461,20 @@ class Profile:
# that this additional feature will slow the heavily optimized
# event/time ratio (i.e., the profiler would run slower, fur a very
# low "value added" feature.)
- #
- # Plugging in the calibration constant doesn't slow down the
- # profiler very much, and the accuracy goes way up.
#**************************************************************
def calibrate(self, m, verbose=0):
+ if self.__class__ is not Profile:
+ raise TypeError("Subclasses must override .calibrate().")
+
+ saved_bias = self.bias
+ self.bias = 0
+ try:
+ return self._callibrate_inner(m, verbose)
+ finally:
+ self.bias = saved_bias
+
+ def _callibrate_inner(self, m, verbose):
get_time = self.get_time
# Set up a test case to be run with and without profiling. Include