1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
"""
Simple benchmark script to do some basic speed tests of json libs
"""
import sys
import time
import urllib.request, urllib.parse, urllib.error
_small = """
{
"name": "benchmark test",
"foo": "bar",
"age": 32,
"weight": 100,
"Height": 154.12,
"married": false,
"siblings": [],
"bar": null
}
"""
_deep = """
{
"foo": "bar",
"nest": {
"foo": %(_small)s,
"nest": {
"foo": %(_small)s,
"nest": {
"foo": %(_small)s,
"nest": {
"foo": %(_small)s,
"nest": {
"foo": %(_small)s,
"nest": %(_small)s
}
}
}
}
}
}
""" % locals()
_big = """
{
"biglist": [%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_deep)s, %(_small)s, %(_deep)s, %(_small)s, %(_deep)s,
%(_small)s, %(_small)s, %(_small)s, %(_small)s, %(_small)s],
"entry1": %(_small)s,
"entry2": %(_deep)s,
"entry3": %(_small)s,
"entry4": %(_deep)s,
"entry5": %(_small)s,
"entry6": %(_deep)s
}
""" % locals()
# The following two will contain real world json from twitter and reddit if
# script is run with the --download flag
_reddit = "[]"
_twitter = "[]"
def load_external_json():
global _reddit, _twitter
_reddit = urllib.request.urlopen("http://reddit.com/.json").read()
_twitter = urllib.request.urlopen("http://api.twitter.com/1/statuses/user_timeline.json?screen_name=twitterapi&count=200").read()
def do_benchmark(impspec, json, runs=10):
modulename, parsename, emitname = impspec
try:
__import__(modulename)
mod = sys.modules[modulename]
reads = getattr(mod, parsename)
dumps = getattr(mod, emitname)
except:
return None
start = time.time()
for n in range(runs):
data = reads(json)
readtime = time.time() - start
start = time.time()
for n in range(runs):
devnull = dumps(data)
return readtime, time.time() - start # tuple (readtime, writetime)
modules = [("json", "loads", "dumps"),
("simplejson", "loads", "dumps"),
("yajl", "loads", "dumps"),
("cjson", "decode", "encode"),
("django.utils.simplejson", "loads", "dumps"),
("jsonpickle", "decode", "encode"),
("jsonlib", "read", "write"),
("jsonlib2", "read", "write"),
#("demjson", "decode"), terribly slow. wont include it
]
if len(sys.argv) > 1 and sys.argv[1] == "--download":
load_external_json()
res = []
runs = 100
for e in modules:
res.append((e[0], do_benchmark(e, _small, runs),
do_benchmark(e, _deep , runs),
do_benchmark(e, _big, runs),
do_benchmark(e, _reddit, runs),
do_benchmark(e, _twitter, runs),
))
no_res = set([e for e in res if e[1] is None])
res = list(set(res) - no_res)
res = [(e[0], sum([x[0] for x in e[1:]]), sum([x[1] for x in e[1:]])) for e in res]
res.sort(lambda a,b: cmp((a[1]+a[2]), b[1]+b[2]))
print("Total Read Write Implementation")
print("-----------------------------------")
for e in res:
print("%.3f %.3f %.3f %s" % (e[1]+e[2], e[1], e[2], e[0]))
for e in no_res:
print("Not installed:", e[0])
|