1
# -*- coding: iso-8859-1 -*-
5
@copyright: 2001-2003 Juergen Hermann <jh@web.de>,
6
2003-2006 MoinMoin:ThomasWaldmann
7
@license: GNU GPL, see COPYING for details.
13
""" Helper class for code profiling
14
we do not use time.clock() as this does not work across threads
15
This is not thread-safe when it comes to multiple starts for one timer.
16
It is possible to recursively call the start and stop methods, you
17
should just ensure that you call them often enough :)
24
def _get_name(timer, generation):
28
return "%s|%i" % (timer, generation)
29
_get_name = staticmethod(_get_name)
31
def start(self, timer):
32
state = self.states.setdefault(timer, -1)
34
name = Clock._get_name(timer, new_level)
35
self.timings[name] = time.time() - self.timings.get(name, 0)
36
self.states[timer] = new_level
38
def stop(self, timer):
39
state = self.states.setdefault(timer, -1)
40
if state >= 0: # timer is active
41
name = Clock._get_name(timer, state)
42
self.timings[name] = time.time() - self.timings[name]
43
self.states[timer] = state - 1
45
def value(self, timer):
46
base_timer = timer.split("|")[0]
47
state = self.states.get(base_timer, None)
49
result = "%.3fs" % self.timings[timer]
51
result = "- (%s)" % state
53
#print "Got state %r" % state
54
result = "%.3fs (still running)" % (time.time() - self.timings[timer])
59
for timer in self.timings:
60
value = self.value(timer)
61
outlist.append("%s = %s" % (timer, value))