blob: 425d6dee9b5b322c88a533be672fca6baee0b7f6 [file] [log] [blame]
Benjamin Petersone711caf2008-06-11 16:44:04 +00001#
2# Simple benchmarks for the multiprocessing package
3#
4
5import time, sys, multiprocessing, threading, Queue, gc
6
7if sys.platform == 'win32':
8 _timer = time.clock
9else:
10 _timer = time.time
11
12delta = 1
13
14
15#### TEST_QUEUESPEED
16
17def queuespeed_func(q, c, iterations):
18 a = '0' * 256
19 c.acquire()
20 c.notify()
21 c.release()
22
23 for i in xrange(iterations):
24 q.put(a)
25
26 q.put('STOP')
27
28def test_queuespeed(Process, q, c):
29 elapsed = 0
30 iterations = 1
31
32 while elapsed < delta:
33 iterations *= 2
34
35 p = Process(target=queuespeed_func, args=(q, c, iterations))
36 c.acquire()
37 p.start()
38 c.wait()
39 c.release()
40
41 result = None
42 t = _timer()
43
44 while result != 'STOP':
45 result = q.get()
46
47 elapsed = _timer() - t
48
49 p.join()
50
51 print iterations, 'objects passed through the queue in', elapsed, 'seconds'
52 print 'average number/sec:', iterations/elapsed
53
54
55#### TEST_PIPESPEED
56
57def pipe_func(c, cond, iterations):
58 a = '0' * 256
59 cond.acquire()
60 cond.notify()
61 cond.release()
62
63 for i in xrange(iterations):
64 c.send(a)
65
66 c.send('STOP')
67
68def test_pipespeed():
69 c, d = multiprocessing.Pipe()
70 cond = multiprocessing.Condition()
71 elapsed = 0
72 iterations = 1
73
74 while elapsed < delta:
75 iterations *= 2
76
77 p = multiprocessing.Process(target=pipe_func,
78 args=(d, cond, iterations))
79 cond.acquire()
80 p.start()
81 cond.wait()
82 cond.release()
83
84 result = None
85 t = _timer()
86
87 while result != 'STOP':
88 result = c.recv()
89
90 elapsed = _timer() - t
91 p.join()
92
93 print iterations, 'objects passed through connection in',elapsed,'seconds'
94 print 'average number/sec:', iterations/elapsed
95
96
97#### TEST_SEQSPEED
98
99def test_seqspeed(seq):
100 elapsed = 0
101 iterations = 1
102
103 while elapsed < delta:
104 iterations *= 2
105
106 t = _timer()
107
108 for i in xrange(iterations):
109 a = seq[5]
110
111 elapsed = _timer()-t
112
113 print iterations, 'iterations in', elapsed, 'seconds'
114 print 'average number/sec:', iterations/elapsed
115
116
117#### TEST_LOCK
118
119def test_lockspeed(l):
120 elapsed = 0
121 iterations = 1
122
123 while elapsed < delta:
124 iterations *= 2
125
126 t = _timer()
127
128 for i in xrange(iterations):
129 l.acquire()
130 l.release()
131
132 elapsed = _timer()-t
133
134 print iterations, 'iterations in', elapsed, 'seconds'
135 print 'average number/sec:', iterations/elapsed
136
137
138#### TEST_CONDITION
139
140def conditionspeed_func(c, N):
141 c.acquire()
142 c.notify()
143
144 for i in xrange(N):
145 c.wait()
146 c.notify()
147
148 c.release()
149
150def test_conditionspeed(Process, c):
151 elapsed = 0
152 iterations = 1
153
154 while elapsed < delta:
155 iterations *= 2
156
157 c.acquire()
158 p = Process(target=conditionspeed_func, args=(c, iterations))
159 p.start()
160
161 c.wait()
162
163 t = _timer()
164
165 for i in xrange(iterations):
166 c.notify()
167 c.wait()
168
169 elapsed = _timer()-t
170
171 c.release()
172 p.join()
173
174 print iterations * 2, 'waits in', elapsed, 'seconds'
175 print 'average number/sec:', iterations * 2 / elapsed
176
177####
178
179def test():
180 manager = multiprocessing.Manager()
181
182 gc.disable()
183
184 print '\n\t######## testing Queue.Queue\n'
185 test_queuespeed(threading.Thread, Queue.Queue(),
186 threading.Condition())
187 print '\n\t######## testing multiprocessing.Queue\n'
188 test_queuespeed(multiprocessing.Process, multiprocessing.Queue(),
189 multiprocessing.Condition())
190 print '\n\t######## testing Queue managed by server process\n'
191 test_queuespeed(multiprocessing.Process, manager.Queue(),
192 manager.Condition())
193 print '\n\t######## testing multiprocessing.Pipe\n'
194 test_pipespeed()
195
196 print
197
198 print '\n\t######## testing list\n'
199 test_seqspeed(range(10))
200 print '\n\t######## testing list managed by server process\n'
201 test_seqspeed(manager.list(range(10)))
202 print '\n\t######## testing Array("i", ..., lock=False)\n'
203 test_seqspeed(multiprocessing.Array('i', range(10), lock=False))
204 print '\n\t######## testing Array("i", ..., lock=True)\n'
205 test_seqspeed(multiprocessing.Array('i', range(10), lock=True))
206
207 print
208
209 print '\n\t######## testing threading.Lock\n'
210 test_lockspeed(threading.Lock())
211 print '\n\t######## testing threading.RLock\n'
212 test_lockspeed(threading.RLock())
213 print '\n\t######## testing multiprocessing.Lock\n'
214 test_lockspeed(multiprocessing.Lock())
215 print '\n\t######## testing multiprocessing.RLock\n'
216 test_lockspeed(multiprocessing.RLock())
217 print '\n\t######## testing lock managed by server process\n'
218 test_lockspeed(manager.Lock())
219 print '\n\t######## testing rlock managed by server process\n'
220 test_lockspeed(manager.RLock())
221
222 print
223
224 print '\n\t######## testing threading.Condition\n'
225 test_conditionspeed(threading.Thread, threading.Condition())
226 print '\n\t######## testing multiprocessing.Condition\n'
227 test_conditionspeed(multiprocessing.Process, multiprocessing.Condition())
228 print '\n\t######## testing condition managed by a server process\n'
229 test_conditionspeed(multiprocessing.Process, manager.Condition())
230
231 gc.enable()
232
233if __name__ == '__main__':
234 multiprocessing.freeze_support()
235 test()