Socket benchmark without httplib

26 March 2008
05:50

By Dave as Python

Poorly coded benchmark sample that uses sockets directly and sadly gives the same results as with httplib.

1 import socket
2 from time import time
3
4 class SimpleHttp(object):
5 def __init__(self, host='127.0.0.1', port=5984, shared=False):
6 self.host = host
7 self.port = port
8 self.shared = shared
9 if shared:
10 self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
11 self.socket.connect((host, port))
12
13 def getline(self, sock):
14 buf = ''
15 while buf[-2:] != '\r\n':
16 buf += sock.recv(1)
17 return buf[:-2]
18
19 def readheaders(self, sock):
20 done = False
21 while not done:
22 line = self.getline(sock)
23 if len(line) == 0:
24 done = True
25
26 def chunkeddata(self, sock):
27 done = False
28 buf = ''
29 while not done:
30 line = self.getline(sock)
31 size = int(line, 16)
32 if size == 0:
33 self.getline(sock)
34 done = True
35 else:
36 data = ''
37 while len(data) < size:
38 data += sock.recv(size - len(data))
39 buf += data
40 self.getline(sock)
41 return buf
42
43 def benchmark(self, req='/', n=10):
44 for i in xrange(10):
45 if self.shared:
46 s = self.socket
47 else:
48 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
49 s.connect((self.host, self.port))
50
51 start = time()
52 s.send("GET %s HTTP/1.1\r\nHost: %s\r\n\r\n" % (req, self.host))
53 headers = self.readheaders(s)
54 data = self.chunkeddata(s)
55 print ' (%2d): GET %6.2fms' % (i, (time() - start) * 1000)
56 if not self.shared:
57 s.close()
58
59 if __name__ == '__main__':
60 bm1 = SimpleHttp()
61 print "Simple benchmark:"
62 bm1.benchmark()
63
64 bm2 = SimpleHttp(shared=True)
65 print "\nShared benchmark:"
66 bm2.benchmark()

Download Raw Source

Comments

  1. Dave says:

    26 March 2008
    05:51

    Whoops, that xrange should be xrange(n), not xrange(10).