[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