#!/usr/bin/env python import sys import couchdb import simplejson import urllib2 import timeit, time import pycurl, cjson import cStringIO as StringIO import curlcon import httplib import httplib2 base = 'http://127.0.0.1:5984/blog/' script = '_view/tags/by_slug' query = '?count=10' #script = '_view/posts/by_date' #query = '?count=10' url = base + script + query key = 'B7D0C1FA430FB4BC379D88B05ACC93C4' url2 = base + key getpath1 = '/blog/' + key getpath2 = '/blog/' + script + query def hGET(): con = httplib.HTTPConnection('127.0.0.1:5984') con.request("GET", getpath1) r1 = con.getresponse() return simplejson.loads(r1.read()) def hVIEW(): con = httplib.HTTPConnection('127.0.0.1:5984') con.request("GET", getpath2) r1 = con.getresponse() return simplejson.loads(r1.read()) def h2GET(): h = httplib2.Http() resp, content = h.request(url2, 'GET') return simplejson.loads(content) def h2VIEW(): h = httplib2.Http() resp, content = h.request(url, 'GET') return simplejson.loads(content) def VIEW(): return simplejson.loads(urllib2.urlopen(url).read()) def GET(): return simplejson.loads(urllib2.urlopen(url2).read()) def curlVIEW(): c = pycurl.Curl() s = StringIO.StringIO() c.setopt(pycurl.URL, url) c.setopt(pycurl.WRITEFUNCTION, s.write) c.perform() s.seek(0) return simplejson.loads(s.read()) def curlGET(): c = pycurl.Curl() s = StringIO.StringIO() c.setopt(pycurl.URL, url2) c.setopt(pycurl.WRITEFUNCTION, s.write) c.perform() s.seek(0) return simplejson.loads(s.read()) def VIEWcj(): return cjson.decode(urllib2.urlopen(url).read()) def GETcj(): return cjson.decode(urllib2.urlopen(url2).read()) def curlVIEWcj(): c = pycurl.Curl() s = StringIO.StringIO() c.setopt(pycurl.URL, url) c.setopt(pycurl.WRITEFUNCTION, s.write) c.perform() s.seek(0) return cjson.decode(s.read()) def curlGETcj(): c = pycurl.Curl() s = StringIO.StringIO() c.setopt(pycurl.URL, url2) c.setopt(pycurl.WRITEFUNCTION, s.write) c.perform() s.seek(0) return cjson.decode(s.read()) s = couchdb.Server('http://127.0.0.1:5984') d = s['blog'] def cdbGET(): return d[key] def cdbVIEW(): return list(d.view(script, count=10)) def ccGET(): cd = curlcon.Database('http://127.0.0.1:5984/blog/') return cd[key] def ccVIEW(): cd = curlcon.Database('http://127.0.0.1:5984/blog/') return cd.view(script, count=10) if __name__ == '__main__': reps = 500 repsf = float(reps) # curl & simple json cv = timeit.Timer('curlVIEW()', 'from __main__ import curlVIEW') cg = timeit.Timer('curlGET()', 'from __main__ import curlGET') # urllib2 & simple json v = timeit.Timer('VIEW()', 'from __main__ import VIEW') g = timeit.Timer('GET()', 'from __main__ import GET') # couchdb server/db dv = timeit.Timer('cdbVIEW()', 'from __main__ import cdbVIEW') dg = timeit.Timer('cdbGET()', 'from __main__ import cdbGET') # curl & cjson cvc = timeit.Timer('curlVIEWcj()', 'from __main__ import curlVIEWcj') cgc = timeit.Timer('curlGETcj()', 'from __main__ import curlGETcj') # urllib2 & cjson vc = timeit.Timer('VIEWcj()', 'from __main__ import VIEWcj') gc = timeit.Timer('GETcj()', 'from __main__ import GETcj') # curlcon vcc = timeit.Timer('ccVIEW()', 'from __main__ import ccVIEW') gcc = timeit.Timer('ccGET()', 'from __main__ import ccGET') # httplib hv = timeit.Timer('hVIEW()', 'from __main__ import hVIEW') hg = timeit.Timer('hGET()', 'from __main__ import hGET') # httplib2 h2v = timeit.Timer('h2VIEW()', 'from __main__ import h2VIEW') h2g = timeit.Timer('h2GET()', 'from __main__ import h2GET') # curl & sjson res_cv = cv.timeit(reps) res_cg = cg.timeit(reps) # urllib2 & sjson res_v = v.timeit(reps) res_g = g.timeit(reps) # curl & cjson res_cvc = cvc.timeit(reps) res_cgc = cgc.timeit(reps) # urllib2 & cjson res_vc = vc.timeit(reps) res_gc = gc.timeit(reps) # couchdb server/db res_dv = dv.timeit(reps) res_dg = dg.timeit(reps) # curlcon res_vcc = vcc.timeit(reps) res_gcc = gcc.timeit(reps) # httplib res_hv = hv.timeit(reps) res_hg = hg.timeit(reps) # httplib2 res_h2v = h2v.timeit(reps) res_h2g = h2g.timeit(reps) print 'urllib2/simplejson %d reqs: GET %0.2fs (%0.2f req/s)\t| VIEW %0.2fs (%0.2f req/s)' %\ (reps, res_g, repsf/res_g, res_v, repsf/res_v) print 'pycurl/simplejson %d reqs: GET %0.2fs (%0.2f req/s)\t| VIEW %0.2fs (%0.2f req/s)' %\ (reps, res_cg, repsf/res_cg, res_cv, repsf/res_cv) print 'urllib2/cjson %d reqs: GET %0.2fs (%0.2f req/s)\t| VIEW %0.2fs (%0.2f req/s)' %\ (reps, res_gc, repsf/res_gc, res_vc, repsf/res_vc) print 'pycurl/cjson %d reqs: GET %0.2fs (%0.2f req/s)\t| VIEW %0.2fs (%0.2f req/s)' %\ (reps, res_cgc, repsf/res_cgc, res_cvc, repsf/res_cvc) print 'curlcon (py-couch) %d reqs: GET %0.2fs (%0.2f req/s)\t| VIEW %0.2fs (%0.2f req/s)' %\ (reps, res_gcc, repsf/res_gcc, res_vcc, repsf/res_vcc) print 'httplib/simplejson %d reqs: GET %0.2fs (%0.2f req/s)\t| VIEW %0.2fs (%0.2f req/s)' %\ (reps, res_hg, repsf/res_hg, res_hv, repsf/res_hv) print 'httplib2/simplejson %d reqs: GET %0.2fs (%0.2f req/s)\t| VIEW %0.2fs (%0.2f req/s)' %\ (reps, res_h2g, repsf/res_h2g, res_h2v, repsf/res_h2v) print 'python-couch %d reqs: GET %0.2fs (%0.2f req/s)\t| VIEW %0.2fs (%0.2f req/s)' %\ (reps, res_dg, repsf/res_dg, res_dv, repsf/res_dv)