blob: acdf6425bc6edbf874a18f2711608a6f7f3ef56f [file] [log] [blame]
Benjamin Petersone711caf2008-06-11 16:44:04 +00001#
2# Simple benchmarks for the multiprocessing package
3#
Benjamin Peterson4469d0c2008-11-30 22:46:23 +00004# Copyright (c) 2006-2008, R Oudkerk
5# All rights reserved.
6#
Benjamin Petersone711caf2008-06-11 16:44:04 +00007
Raymond Hettinger40fc59d2011-04-26 13:55:55 -07008import time
9import sys
10import multiprocessing
11import threading
12import queue
13import gc
Benjamin Petersone711caf2008-06-11 16:44:04 +000014
15if sys.platform == 'win32':
16 _timer = time.clock
17else:
18 _timer = time.time
19
20delta = 1
21
22
23#### TEST_QUEUESPEED
24
25def queuespeed_func(q, c, iterations):
26 a = '0' * 256
27 c.acquire()
28 c.notify()
29 c.release()
30
Christian Heimesaae1b702008-11-28 11:23:26 +000031 for i in range(iterations):
Benjamin Petersone711caf2008-06-11 16:44:04 +000032 q.put(a)
33
34 q.put('STOP')
35
36def test_queuespeed(Process, q, c):
37 elapsed = 0
38 iterations = 1
39
40 while elapsed < delta:
41 iterations *= 2
42
43 p = Process(target=queuespeed_func, args=(q, c, iterations))
44 c.acquire()
45 p.start()
46 c.wait()
47 c.release()
48
49 result = None
50 t = _timer()
51
52 while result != 'STOP':
53 result = q.get()
54
55 elapsed = _timer() - t
56
57 p.join()
58
Christian Heimesaae1b702008-11-28 11:23:26 +000059 print(iterations, 'objects passed through the queue in', elapsed, 'seconds')
60 print('average number/sec:', iterations/elapsed)
Benjamin Petersone711caf2008-06-11 16:44:04 +000061
62
63#### TEST_PIPESPEED
64
65def pipe_func(c, cond, iterations):
66 a = '0' * 256
67 cond.acquire()
68 cond.notify()
69 cond.release()
70
Christian Heimesaae1b702008-11-28 11:23:26 +000071 for i in range(iterations):
Benjamin Petersone711caf2008-06-11 16:44:04 +000072 c.send(a)
73
74 c.send('STOP')
75
76def test_pipespeed():
77 c, d = multiprocessing.Pipe()
78 cond = multiprocessing.Condition()
79 elapsed = 0
80 iterations = 1
81
82 while elapsed < delta:
83 iterations *= 2
84
85 p = multiprocessing.Process(target=pipe_func,
86 args=(d, cond, iterations))
87 cond.acquire()
88 p.start()
89 cond.wait()
90 cond.release()
91
92 result = None
93 t = _timer()
94
95 while result != 'STOP':
96 result = c.recv()
97
98 elapsed = _timer() - t
99 p.join()
100
Christian Heimesaae1b702008-11-28 11:23:26 +0000101 print(iterations, 'objects passed through connection in',elapsed,'seconds')
102 print('average number/sec:', iterations/elapsed)
Benjamin Petersone711caf2008-06-11 16:44:04 +0000103
104
105#### TEST_SEQSPEED
106
107def test_seqspeed(seq):
108 elapsed = 0
109 iterations = 1
110
111 while elapsed < delta:
112 iterations *= 2
113
114 t = _timer()
115
Christian Heimesaae1b702008-11-28 11:23:26 +0000116 for i in range(iterations):
Benjamin Petersone711caf2008-06-11 16:44:04 +0000117 a = seq[5]
118
Raymond Hettinger40fc59d2011-04-26 13:55:55 -0700119 elapsed = _timer() - t
Benjamin Petersone711caf2008-06-11 16:44:04 +0000120
Christian Heimesaae1b702008-11-28 11:23:26 +0000121 print(iterations, 'iterations in', elapsed, 'seconds')
122 print('average number/sec:', iterations/elapsed)
Benjamin Petersone711caf2008-06-11 16:44:04 +0000123
124
125#### TEST_LOCK
126
127def test_lockspeed(l):
128 elapsed = 0
129 iterations = 1
130
131 while elapsed < delta:
132 iterations *= 2
133
134 t = _timer()
135
Christian Heimesaae1b702008-11-28 11:23:26 +0000136 for i in range(iterations):
Benjamin Petersone711caf2008-06-11 16:44:04 +0000137 l.acquire()
138 l.release()
139
Raymond Hettinger40fc59d2011-04-26 13:55:55 -0700140 elapsed = _timer() - t
Benjamin Petersone711caf2008-06-11 16:44:04 +0000141
Christian Heimesaae1b702008-11-28 11:23:26 +0000142 print(iterations, 'iterations in', elapsed, 'seconds')
143 print('average number/sec:', iterations/elapsed)
Benjamin Petersone711caf2008-06-11 16:44:04 +0000144
145
146#### TEST_CONDITION
147
148def conditionspeed_func(c, N):
149 c.acquire()
150 c.notify()
151
Christian Heimesaae1b702008-11-28 11:23:26 +0000152 for i in range(N):
Benjamin Petersone711caf2008-06-11 16:44:04 +0000153 c.wait()
154 c.notify()
155
156 c.release()
157
158def test_conditionspeed(Process, c):
159 elapsed = 0
160 iterations = 1
161
162 while elapsed < delta:
163 iterations *= 2
164
165 c.acquire()
166 p = Process(target=conditionspeed_func, args=(c, iterations))
167 p.start()
168
169 c.wait()
170
171 t = _timer()
172
Christian Heimesaae1b702008-11-28 11:23:26 +0000173 for i in range(iterations):
Benjamin Petersone711caf2008-06-11 16:44:04 +0000174 c.notify()
175 c.wait()
176
Raymond Hettinger40fc59d2011-04-26 13:55:55 -0700177 elapsed = _timer() - t
Benjamin Petersone711caf2008-06-11 16:44:04 +0000178
179 c.release()
180 p.join()
181
Christian Heimesaae1b702008-11-28 11:23:26 +0000182 print(iterations * 2, 'waits in', elapsed, 'seconds')
183 print('average number/sec:', iterations * 2 / elapsed)
Benjamin Petersone711caf2008-06-11 16:44:04 +0000184
185####
186
187def test():
188 manager = multiprocessing.Manager()
189
190 gc.disable()
191
Christian Heimesaae1b702008-11-28 11:23:26 +0000192 print('\n\t######## testing Queue.Queue\n')
193 test_queuespeed(threading.Thread, queue.Queue(),
Benjamin Petersone711caf2008-06-11 16:44:04 +0000194 threading.Condition())
Christian Heimesaae1b702008-11-28 11:23:26 +0000195 print('\n\t######## testing multiprocessing.Queue\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000196 test_queuespeed(multiprocessing.Process, multiprocessing.Queue(),
197 multiprocessing.Condition())
Christian Heimesaae1b702008-11-28 11:23:26 +0000198 print('\n\t######## testing Queue managed by server process\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000199 test_queuespeed(multiprocessing.Process, manager.Queue(),
200 manager.Condition())
Christian Heimesaae1b702008-11-28 11:23:26 +0000201 print('\n\t######## testing multiprocessing.Pipe\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000202 test_pipespeed()
203
Christian Heimesaae1b702008-11-28 11:23:26 +0000204 print()
Benjamin Petersone711caf2008-06-11 16:44:04 +0000205
Christian Heimesaae1b702008-11-28 11:23:26 +0000206 print('\n\t######## testing list\n')
207 test_seqspeed(list(range(10)))
208 print('\n\t######## testing list managed by server process\n')
209 test_seqspeed(manager.list(list(range(10))))
210 print('\n\t######## testing Array("i", ..., lock=False)\n')
211 test_seqspeed(multiprocessing.Array('i', list(range(10)), lock=False))
212 print('\n\t######## testing Array("i", ..., lock=True)\n')
213 test_seqspeed(multiprocessing.Array('i', list(range(10)), lock=True))
Benjamin Petersone711caf2008-06-11 16:44:04 +0000214
Christian Heimesaae1b702008-11-28 11:23:26 +0000215 print()
Benjamin Petersone711caf2008-06-11 16:44:04 +0000216
Christian Heimesaae1b702008-11-28 11:23:26 +0000217 print('\n\t######## testing threading.Lock\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000218 test_lockspeed(threading.Lock())
Christian Heimesaae1b702008-11-28 11:23:26 +0000219 print('\n\t######## testing threading.RLock\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000220 test_lockspeed(threading.RLock())
Christian Heimesaae1b702008-11-28 11:23:26 +0000221 print('\n\t######## testing multiprocessing.Lock\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000222 test_lockspeed(multiprocessing.Lock())
Christian Heimesaae1b702008-11-28 11:23:26 +0000223 print('\n\t######## testing multiprocessing.RLock\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000224 test_lockspeed(multiprocessing.RLock())
Christian Heimesaae1b702008-11-28 11:23:26 +0000225 print('\n\t######## testing lock managed by server process\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000226 test_lockspeed(manager.Lock())
Christian Heimesaae1b702008-11-28 11:23:26 +0000227 print('\n\t######## testing rlock managed by server process\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000228 test_lockspeed(manager.RLock())
229
Christian Heimesaae1b702008-11-28 11:23:26 +0000230 print()
Benjamin Petersone711caf2008-06-11 16:44:04 +0000231
Christian Heimesaae1b702008-11-28 11:23:26 +0000232 print('\n\t######## testing threading.Condition\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000233 test_conditionspeed(threading.Thread, threading.Condition())
Christian Heimesaae1b702008-11-28 11:23:26 +0000234 print('\n\t######## testing multiprocessing.Condition\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000235 test_conditionspeed(multiprocessing.Process, multiprocessing.Condition())
Christian Heimesaae1b702008-11-28 11:23:26 +0000236 print('\n\t######## testing condition managed by a server process\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000237 test_conditionspeed(multiprocessing.Process, manager.Condition())
238
239 gc.enable()
240
241if __name__ == '__main__':
242 multiprocessing.freeze_support()
243 test()