[pypy-svn] r64945 - in pypy/branch/pyjitpl5/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Fri May 1 17:05:44 CEST 2009
Author: arigo
Date: Fri May 1 17:05:43 2009
New Revision: 64945
Modified:
pypy/branch/pyjitpl5/pypy/jit/metainterp/jitprof.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_jitprof.py
Log:
Improve jitprof to not build list potentially very long list
in memory. It can cause random tweaks to the runtimes.
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/jitprof.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/jitprof.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/jitprof.py Fri May 1 17:05:43 2009
@@ -8,12 +8,6 @@
BACKEND = 1
RUNNING = 2
BLACKHOLE = 3
-LAST_START = 3
-
-END_TRACING = 4
-END_BACKEND = 5
-END_RUNNING = 6
-END_BLACKHOLE = 7
class EmptyProfiler(object):
initialized = True
@@ -50,61 +44,54 @@
class Profiler(object):
initialized = False
- timer = time.clock
+ timer = time.time
def start(self):
- self.t0 = self.timer()
- self.events = []
+ self.starttime = self.timer()
+ self.t1 = self.starttime
+ self.times = [0, 0, 0, 0]
+ self.current = []
def finish(self):
self.tk = self.timer()
- self.summarize()
self.print_stats()
- def start_tracing(self):
- self.events.append((self.timer(), TRACING))
-
- def end_tracing(self):
- self.events.append((self.timer(), END_TRACING))
-
- def start_backend(self):
- self.events.append((self.timer(), BACKEND))
-
- def end_backend(self):
- self.events.append((self.timer(), END_BACKEND))
+ def _start(self, event):
+ t0 = self.t1
+ self.t1 = self.timer()
+ if self.current:
+ self.times[self.current[-1]] += self.t1 - t0
+ self.current.append(event)
+
+ def _end(self, event):
+ t0 = self.t1
+ self.t1 = self.timer()
+ if not self.current:
+ raise BrokenProfilerData
+ ev1 = self.current.pop()
+ if ev1 != event:
+ raise BrokenProfilerData
+ self.times[ev1] += self.t1 - t0
+
+ def start_tracing(self): self._start(TRACING)
+ def end_tracing(self): self._end (TRACING)
- def start_running(self):
- self.events.append((self.timer(), RUNNING))
+ def start_backend(self): self._start(BACKEND)
+ def end_backend(self): self._end (BACKEND)
- def end_running(self):
- self.events.append((self.timer(), END_RUNNING))
+ def start_running(self): self._start(RUNNING)
+ def end_running(self): self._end (RUNNING)
- def start_blackhole(self):
- self.events.append((self.timer(), BLACKHOLE))
+ def start_blackhole(self): self._start(BLACKHOLE)
+ def end_blackhole(self): self._end (BLACKHOLE)
- def end_blackhole(self):
- self.events.append((self.timer(), END_BLACKHOLE))
+ def print_stats(self):
+ print "Tracing: %f" % self.times[TRACING]
+ print "Backend: %f" % self.times[BACKEND]
+ print "Running asm: %f" % self.times[RUNNING]
+ print "Blackhole: %f" % self.times[BLACKHOLE]
+ print "TOTAL: %f" % (self.tk - self.starttime)
- def summarize(self):
- current = []
- t = 0
- times = [0, 0, 0, 0]
- for t0, ev in self.events:
- if ev <= LAST_START:
- if current:
- times[current[-1]] += t0 - t
- current.append(ev)
- else:
- times[current.pop()] += t0 - t
- t = t0
- self.trace_time = times[TRACING]
- self.backend_time = times[BACKEND]
- self.run_time = times[RUNNING]
- self.blackhole_time = times[BLACKHOLE]
- def print_stats(self):
- print "Tracing: %f" % self.trace_time
- print "Backend: %f" % self.backend_time
- print "Running asm: %f" % self.run_time
- print "Blackhole: %f" % self.blackhole_time
- print "TOTAL: %f" % (self.tk - self.t0)
+class BrokenProfilerData(Exception):
+ pass
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_jitprof.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_jitprof.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_jitprof.py Fri May 1 17:05:43 2009
@@ -7,14 +7,20 @@
class FakeProfiler(Profiler):
def __init__(self):
- self.counter = 0
+ self.counter = 123456
+ self.events = []
def timer(self):
self.counter += 1
return self.counter - 1
-## def print_stats(self):
-## pass
+ def _start(self, event):
+ Profiler._start(self, event)
+ self.events.append(event)
+
+ def _end(self, event):
+ Profiler._end(self, event)
+ self.events.append(~event)
class ProfilerMixin(LLJitMixin):
def meta_interp(self, *args, **kwds):
@@ -37,19 +43,15 @@
res = self.meta_interp(f, [6, 7])
assert res == 84
profiler = pyjitpl._warmrunnerdesc.metainterp_sd.profiler
- assert len(profiler.events) == 8
expected = [
TRACING,
BACKEND,
- END_BACKEND,
- END_TRACING,
+ ~ BACKEND,
+ ~ TRACING,
RUNNING,
- END_RUNNING,
+ ~ RUNNING,
BLACKHOLE,
- END_BLACKHOLE
+ ~ BLACKHOLE
]
- assert [i[1] for i in profiler.events] == expected
- assert profiler.trace_time == 2
- assert profiler.backend_time == 1
- assert profiler.run_time == 1
- assert profiler.blackhole_time == 1
+ assert profiler.events == expected
+ assert profiler.times == [2, 1, 1, 1]
More information about the Pypy-commit
mailing list