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
|
"""Plot latency data from messaging benchmarks.
To generate the data for each library, I started the server and then did
the following for each client::
from xmlrpc_client import client
for i in range(9):
s = '0'*10**i
print s
%timeit client.echo(s)
"""
from matplotlib.pylab import *
rawdata = """# Data in milliseconds
Bytes JSONRPC PYRO XMLRPC pyzmq_copy pyzmq_nocopy
1 2.15 0.186 2.07 0.111 0.136
10 2.49 0.187 1.87 0.115 0.137
100 2.5 0.189 1.9 0.126 0.138
1000 2.54 0.196 1.91 0.129 0.141
10000 2.91 0.271 2.77 0.204 0.197
100000 6.65 1.44 9.17 0.961 0.546
1000000 50.2 15.8 81.5 8.39 2.25
10000000 491 159 816 91.7 25.2
100000000 5010 1560 8300 893 248
"""
with open('latency.csv','w') as f:
f.writelines(rawdata)
data = csv2rec('latency.csv',delimiter='\t')
loglog(data.bytes, data.xmlrpc*1000, label='XMLRPC')
loglog(data.bytes, data.jsonrpc*1000, label='JSONRPC')
loglog(data.bytes, data.pyro*1000, label='Pyro')
loglog(data.bytes, data.pyzmq_nocopy*1000, label='PyZMQ')
loglog(data.bytes, len(data.bytes)*[60], label='Ping')
legend(loc=2)
title('Latency')
xlabel('Number of bytes')
ylabel('Round trip latency ($\mu s$)')
grid(True)
show()
savefig('latency.png')
clf()
semilogx(data.bytes, 1000/data.xmlrpc, label='XMLRPC')
semilogx(data.bytes, 1000/data.jsonrpc, label='JSONRPC')
semilogx(data.bytes, 1000/data.pyro, label='Pyro')
semilogx(data.bytes, 1000/data.pyzmq_nocopy, label='PyZMQ')
legend(loc=1)
xlabel('Number of bytes')
ylabel('Message/s')
title('Message Throughput')
grid(True)
show()
savefig('msgs_sec.png')
clf()
loglog(data.bytes, 1000/data.xmlrpc, label='XMLRPC')
loglog(data.bytes, 1000/data.jsonrpc, label='JSONRPC')
loglog(data.bytes, 1000/data.pyro, label='Pyro')
loglog(data.bytes, 1000/data.pyzmq_nocopy, label='PyZMQ')
legend(loc=3)
xlabel('Number of bytes')
ylabel('Message/s')
title('Message Throughput')
grid(True)
show()
savefig('msgs_sec_log.png')
clf()
semilogx(data.bytes, data.pyro/data.pyzmq_nocopy, label="No-copy")
semilogx(data.bytes, data.pyro/data.pyzmq_copy, label="Copy")
xlabel('Number of bytes')
ylabel('Ratio throughputs')
title('PyZMQ Throughput/Pyro Throughput')
grid(True)
legend(loc=2)
show()
savefig('msgs_sec_ratio.png')
|