[pypy-commit] pypy default: Merged logging-perf branch.

alex_gaynor noreply at buildbot.pypy.org
Tue May 28 19:08:39 CEST 2013


Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: 
Changeset: r64629:21a05f62d97f
Date: 2013-05-28 10:08 -0700
http://bitbucket.org/pypy/pypy/changeset/21a05f62d97f/

Log:	Merged logging-perf branch.

	This speeds up logging in many (all?) cases by unrolling
	sys._getframe(<constant>) which allows much of the logging code to
	be constant folded. Note that this can still have poor performance
	in the case that something is logged in a long loop, which causes an
	abort due to trace too long. logging traces have a TON of stuff that
	is constant folded in optimizeopt/ which means that their
	unoptimized trace is often an order of magnitude more than their
	optimized length.

diff --git a/pypy/module/pypyjit/test_pypy_c/test_getframe.py b/pypy/module/pypyjit/test_pypy_c/test_getframe.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/pypyjit/test_pypy_c/test_getframe.py
@@ -0,0 +1,25 @@
+from pypy.module.pypyjit.test_pypy_c.test_00_model import BaseTestPyPyC
+
+
+class TestGetFrame(BaseTestPyPyC):
+    def test_getframe_one(self):
+        def main(n):
+            import sys
+
+            i = 0
+            while i < n:
+                assert sys._getframe(0).f_code.co_filename == __file__
+                i += 1
+            return i
+
+        log = self.run(main, [300])
+        assert log.result == 300
+        loop, = log.loops_by_filename(self.filepath)
+        assert loop.match("""
+        i54 = int_lt(i47, i28)
+        guard_true(i54, descr=...)
+        guard_not_invalidated(descr=...)
+        i55 = int_add(i47, 1)
+        --TICK--
+        jump(..., descr=...)
+        """)
diff --git a/pypy/module/sys/vm.py b/pypy/module/sys/vm.py
--- a/pypy/module/sys/vm.py
+++ b/pypy/module/sys/vm.py
@@ -1,14 +1,18 @@
 """
 Implementation of interpreter-level 'sys' routines.
 """
-from pypy.interpreter import gateway
-from pypy.interpreter.error import OperationError
-from pypy.interpreter.gateway import unwrap_spec, WrappedDefault
+
 from rpython.rlib import jit
 from rpython.rlib.runicode import MAXUNICODE
 
+from pypy.interpreter import gateway
+from pypy.interpreter.error import OperationError
+from pypy.interpreter.gateway import unwrap_spec
+
+
 # ____________________________________________________________
 
+
 @unwrap_spec(depth=int)
 def _getframe(space, depth=0):
     """Return a frame object from the call stack.  If optional integer depth is
@@ -21,6 +25,11 @@
     if depth < 0:
         raise OperationError(space.w_ValueError,
                              space.wrap("frame index must not be negative"))
+    return getframe(space, depth)
+
+
+ at jit.look_inside_iff(lambda space, depth: jit.isconstant(depth))
+def getframe(space, depth):
     ec = space.getexecutioncontext()
     f = ec.gettopframe_nohidden()
     while True:
@@ -28,11 +37,11 @@
             raise OperationError(space.w_ValueError,
                                  space.wrap("call stack is not deep enough"))
         if depth == 0:
-            break
+            f.mark_as_escaped()
+            return space.wrap(f)
         depth -= 1
         f = ec.getnextframe_nohidden(f)
-    f.mark_as_escaped()
-    return space.wrap(f)
+
 
 @unwrap_spec(new_limit="c_int")
 def setrecursionlimit(space, new_limit):
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -156,7 +156,7 @@
             iteritems = self._fields.iteritems()
             if not we_are_translated(): #random order is fine, except for tests
                 iteritems = list(iteritems)
-                iteritems.sort(key = lambda (x,y): x.sort_key())
+                iteritems.sort(key=lambda (x, y): x.sort_key())
             for ofs, value in iteritems:
                 if value.is_null():
                     continue
diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -1158,6 +1158,7 @@
         obj = box.getref_base()
         vref = vrefinfo.virtual_ref_during_tracing(obj)
         resbox = history.BoxPtr(vref)
+        self.metainterp.heapcache.new(resbox)
         cindex = history.ConstInt(len(metainterp.virtualref_boxes) // 2)
         metainterp.history.record(rop.VIRTUAL_REF, [box, cindex], resbox)
         # Note: we allocate a JIT_VIRTUAL_REF here


More information about the pypy-commit mailing list