summaryrefslogtreecommitdiffstats
path: root/Lib/profile.py
diff options
context:
space:
mode:
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 6c1edea..db40790 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