[pypy-commit] pypy fastjson: add a target to benchmark _pypyjson without a full translation

antocuni noreply at buildbot.pypy.org
Mon Jul 8 10:53:42 CEST 2013


Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: fastjson
Changeset: r65260:a7e6ac9b38e9
Date: 2013-07-08 10:52 +0200
http://bitbucket.org/pypy/pypy/changeset/a7e6ac9b38e9/

Log:	add a target to benchmark _pypyjson without a full translation

diff --git a/pypy/module/_pypyjson/targetjson.py b/pypy/module/_pypyjson/targetjson.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_pypyjson/targetjson.py
@@ -0,0 +1,143 @@
+import sys
+import py
+ROOT = py.path.local(__file__).dirpath('..', '..', '..')
+sys.path.insert(0, str(ROOT))
+
+import time
+from rpython.rlib.streamio import open_file_as_stream
+from pypy.interpreter.error import OperationError
+from pypy.module._pypyjson.interp_decoder import loads
+
+
+
+## MSG = open('msg.json').read()
+
+class W_Root(object):
+    pass
+
+class W_Dict(W_Root):
+    def __init__(self):
+        self.dictval = {}
+
+class W_Unicode(W_Root):
+    def __init__(self, x):
+        self.unival = x
+
+class W_String(W_Root):
+    def __init__(self, x):
+        self.strval = x
+
+class W_Int(W_Root):
+    def __init__(self, x):
+        self.intval = x
+
+class W_Float(W_Root):
+    def __init__(self, x):
+        self.floatval = x
+
+class W_List(W_Root):
+    def __init__(self):
+        self.listval = []
+
+class W_Singleton(W_Root):
+    def __init__(self, name):
+        self.name = name
+
+class FakeSpace(object):
+
+    w_None = W_Singleton('None')
+    w_True = W_Singleton('True')
+    w_False = W_Singleton('False')
+    w_ValueError = W_Singleton('ValueError')
+    w_UnicodeDecodeError = W_Singleton('UnicodeDecodeError')
+    w_unicode = W_Unicode
+    w_int = W_Int
+    w_float = W_Float
+
+    def newtuple(self, items):
+        return None
+
+    def newdict(self):
+        return W_Dict()
+
+    def newlist(self, items):
+        return W_List()
+
+    def isinstance_w(self, w_x, w_type):
+        return isinstance(w_x, w_type)
+
+    def str_w(self, w_x):
+        assert isinstance(w_x, W_String)
+        return w_x.strval
+
+    def call_method(self, obj, name, arg):
+        assert name == 'append'
+        assert isinstance(obj, W_List)
+        obj.listval.append(arg)
+    call_method._dont_inline_ = True
+
+    def call_function(self, w_func, *args_w):
+        return self.w_None # XXX
+
+    def setitem(self, d, key, value):
+        assert isinstance(d, W_Dict)
+        assert isinstance(key, W_Unicode)
+        d.dictval[key.unival] = value
+
+    def wrapunicode(self, x):
+        return W_Unicode(x)
+
+    def wrapint(self, x):
+        return W_Int(x)
+
+    def wrapfloat(self, x):
+        return W_Float(x)
+    
+    def wrap(self, x):
+        if isinstance(x, int):
+            return W_Int(x)
+        elif isinstance(x, float):
+            return W_Float(x)
+        ## elif isinstance(x, str):
+        ##     assert False
+        else:
+            return W_Unicode(unicode(x))
+    wrap._annspecialcase_ = "specialize:argtype(1)"
+
+
+fakespace = FakeSpace()
+
+def myloads(msg):
+    return loads(fakespace, W_String(msg))
+    
+
+def bench(title, N, fn, arg):
+    a = time.clock()
+    for i in range(N):
+        res = fn(arg)
+    b = time.clock()
+    print title, (b-a) / N * 1000
+
+def entry_point(argv):
+    if len(argv) != 3:
+        print 'Usage: %s FILE n' % argv[0]
+        return 1
+    filename = argv[1]
+    N = int(argv[2])
+    f = open_file_as_stream(filename)
+    msg = f.readall()
+    
+    try:
+        bench('loads     ', N, myloads,  msg)
+    except OperationError, e:
+        print 'Error', e._compute_value(fakespace)
+        
+    return 0
+
+# _____ Define and setup target ___
+
+def target(*args):
+    return entry_point, None
+
+if __name__ == '__main__':
+    entry_point(sys.argv)


More information about the pypy-commit mailing list