blob: 4556de0808ce017efab8860e93840e4fa21e00d6 [file] [log] [blame]
Benjamin Petersone711caf2008-06-11 16:44:04 +00001#
2# Simple benchmarks for the multiprocessing package
3#
4
Christian Heimesaae1b702008-11-28 11:23:26 +00005import time, sys, multiprocessing, threading, queue, gc
Benjamin Petersone711caf2008-06-11 16:44:04 +00006
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
Christian Heimesaae1b702008-11-28 11:23:26 +000023 for i in range(iterations):
Benjamin Petersone711caf2008-06-11 16:44:04 +000024 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
Christian Heimesaae1b702008-11-28 11:23:26 +000051 print(iterations, 'objects passed through the queue in', elapsed, 'seconds')
52 print('average number/sec:', iterations/elapsed)
Benjamin Petersone711caf2008-06-11 16:44:04 +000053
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
Christian Heimesaae1b702008-11-28 11:23:26 +000063 for i in range(iterations):
Benjamin Petersone711caf2008-06-11 16:44:04 +000064 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
Christian Heimesaae1b702008-11-28 11:23:26 +000093 print(iterations, 'objects passed through connection in',elapsed,'seconds')
94 print('average number/sec:', iterations/elapsed)
Benjamin Petersone711caf2008-06-11 16:44:04 +000095
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
Christian Heimesaae1b702008-11-28 11:23:26 +0000108 for i in range(iterations):
Benjamin Petersone711caf2008-06-11 16:44:04 +0000109 a = seq[5]
110
111 elapsed = _timer()-t
112
Christian Heimesaae1b702008-11-28 11:23:26 +0000113 print(iterations, 'iterations in', elapsed, 'seconds')
114 print('average number/sec:', iterations/elapsed)
Benjamin Petersone711caf2008-06-11 16:44:04 +0000115
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
Christian Heimesaae1b702008-11-28 11:23:26 +0000128 for i in range(iterations):
Benjamin Petersone711caf2008-06-11 16:44:04 +0000129 l.acquire()
130 l.release()
131
132 elapsed = _timer()-t
133
Christian Heimesaae1b702008-11-28 11:23:26 +0000134 print(iterations, 'iterations in', elapsed, 'seconds')
135 print('average number/sec:', iterations/elapsed)
Benjamin Petersone711caf2008-06-11 16:44:04 +0000136
137
138#### TEST_CONDITION
139
140def conditionspeed_func(c, N):
141 c.acquire()
142 c.notify()
143
Christian Heimesaae1b702008-11-28 11:23:26 +0000144 for i in range(N):
Benjamin Petersone711caf2008-06-11 16:44:04 +0000145 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
Christian Heimesaae1b702008-11-28 11:23:26 +0000165 for i in range(iterations):
Benjamin Petersone711caf2008-06-11 16:44:04 +0000166 c.notify()
167 c.wait()
168
169 elapsed = _timer()-t
170
171 c.release()
172 p.join()
173
Christian Heimesaae1b702008-11-28 11:23:26 +0000174 print(iterations * 2, 'waits in', elapsed, 'seconds')
175 print('average number/sec:', iterations * 2 / elapsed)
Benjamin Petersone711caf2008-06-11 16:44:04 +0000176
177####
178
179def test():
180 manager = multiprocessing.Manager()
181
182 gc.disable()
183
Christian Heimesaae1b702008-11-28 11:23:26 +0000184 print('\n\t######## testing Queue.Queue\n')
185 test_queuespeed(threading.Thread, queue.Queue(),
Benjamin Petersone711caf2008-06-11 16:44:04 +0000186 threading.Condition())
Christian Heimesaae1b702008-11-28 11:23:26 +0000187 print('\n\t######## testing multiprocessing.Queue\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000188 test_queuespeed(multiprocessing.Process, multiprocessing.Queue(),
189 multiprocessing.Condition())
Christian Heimesaae1b702008-11-28 11:23:26 +0000190 print('\n\t######## testing Queue managed by server process\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000191 test_queuespeed(multiprocessing.Process, manager.Queue(),
192 manager.Condition())
Christian Heimesaae1b702008-11-28 11:23:26 +0000193 print('\n\t######## testing multiprocessing.Pipe\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000194 test_pipespeed()
195
Christian Heimesaae1b702008-11-28 11:23:26 +0000196 print()
Benjamin Petersone711caf2008-06-11 16:44:04 +0000197
Christian Heimesaae1b702008-11-28 11:23:26 +0000198 print('\n\t######## testing list\n')
199 test_seqspeed(list(range(10)))
200 print('\n\t######## testing list managed by server process\n')
201 test_seqspeed(manager.list(list(range(10))))
202 print('\n\t######## testing Array("i", ..., lock=False)\n')
203 test_seqspeed(multiprocessing.Array('i', list(range(10)), lock=False))
204 print('\n\t######## testing Array("i", ..., lock=True)\n')
205 test_seqspeed(multiprocessing.Array('i', list(range(10)), lock=True))
Benjamin Petersone711caf2008-06-11 16:44:04 +0000206
Christian Heimesaae1b702008-11-28 11:23:26 +0000207 print()
Benjamin Petersone711caf2008-06-11 16:44:04 +0000208
Christian Heimesaae1b702008-11-28 11:23:26 +0000209 print('\n\t######## testing threading.Lock\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000210 test_lockspeed(threading.Lock())
Christian Heimesaae1b702008-11-28 11:23:26 +0000211 print('\n\t######## testing threading.RLock\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000212 test_lockspeed(threading.RLock())
Christian Heimesaae1b702008-11-28 11:23:26 +0000213 print('\n\t######## testing multiprocessing.Lock\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000214 test_lockspeed(multiprocessing.Lock())
Christian Heimesaae1b702008-11-28 11:23:26 +0000215 print('\n\t######## testing multiprocessing.RLock\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000216 test_lockspeed(multiprocessing.RLock())
Christian Heimesaae1b702008-11-28 11:23:26 +0000217 print('\n\t######## testing lock managed by server process\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000218 test_lockspeed(manager.Lock())
Christian Heimesaae1b702008-11-28 11:23:26 +0000219 print('\n\t######## testing rlock managed by server process\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000220 test_lockspeed(manager.RLock())
221
Christian Heimesaae1b702008-11-28 11:23:26 +0000222 print()
Benjamin Petersone711caf2008-06-11 16:44:04 +0000223
Christian Heimesaae1b702008-11-28 11:23:26 +0000224 print('\n\t######## testing threading.Condition\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000225 test_conditionspeed(threading.Thread, threading.Condition())
Christian Heimesaae1b702008-11-28 11:23:26 +0000226 print('\n\t######## testing multiprocessing.Condition\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000227 test_conditionspeed(multiprocessing.Process, multiprocessing.Condition())
Christian Heimesaae1b702008-11-28 11:23:26 +0000228 print('\n\t######## testing condition managed by a server process\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000229 test_conditionspeed(multiprocessing.Process, manager.Condition())
230
231 gc.enable()
232
233if __name__ == '__main__':
234 multiprocessing.freeze_support()
235 test()