blob: 3763ea94484e19d7f977863ba940808a4e44a5f7 [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
Raymond Hettinger40fc59d2011-04-26 13:55:55 -07009import multiprocessing
10import threading
11import queue
12import gc
Benjamin Petersone711caf2008-06-11 16:44:04 +000013
Victor Stinnerfe98e2f2012-04-29 03:01:20 +020014_timer = time.perf_counter
Benjamin Petersone711caf2008-06-11 16:44:04 +000015
16delta = 1
17
18
19#### TEST_QUEUESPEED
20
21def queuespeed_func(q, c, iterations):
22 a = '0' * 256
23 c.acquire()
24 c.notify()
25 c.release()
26
Christian Heimesaae1b702008-11-28 11:23:26 +000027 for i in range(iterations):
Benjamin Petersone711caf2008-06-11 16:44:04 +000028 q.put(a)
29
30 q.put('STOP')
31
32def test_queuespeed(Process, q, c):
33 elapsed = 0
34 iterations = 1
35
36 while elapsed < delta:
37 iterations *= 2
38
39 p = Process(target=queuespeed_func, args=(q, c, iterations))
40 c.acquire()
41 p.start()
42 c.wait()
43 c.release()
44
45 result = None
46 t = _timer()
47
48 while result != 'STOP':
49 result = q.get()
50
51 elapsed = _timer() - t
52
53 p.join()
54
Christian Heimesaae1b702008-11-28 11:23:26 +000055 print(iterations, 'objects passed through the queue in', elapsed, 'seconds')
56 print('average number/sec:', iterations/elapsed)
Benjamin Petersone711caf2008-06-11 16:44:04 +000057
58
59#### TEST_PIPESPEED
60
61def pipe_func(c, cond, iterations):
62 a = '0' * 256
63 cond.acquire()
64 cond.notify()
65 cond.release()
66
Christian Heimesaae1b702008-11-28 11:23:26 +000067 for i in range(iterations):
Benjamin Petersone711caf2008-06-11 16:44:04 +000068 c.send(a)
69
70 c.send('STOP')
71
72def test_pipespeed():
73 c, d = multiprocessing.Pipe()
74 cond = multiprocessing.Condition()
75 elapsed = 0
76 iterations = 1
77
78 while elapsed < delta:
79 iterations *= 2
80
81 p = multiprocessing.Process(target=pipe_func,
82 args=(d, cond, iterations))
83 cond.acquire()
84 p.start()
85 cond.wait()
86 cond.release()
87
88 result = None
89 t = _timer()
90
91 while result != 'STOP':
92 result = c.recv()
93
94 elapsed = _timer() - t
95 p.join()
96
Christian Heimesaae1b702008-11-28 11:23:26 +000097 print(iterations, 'objects passed through connection in',elapsed,'seconds')
98 print('average number/sec:', iterations/elapsed)
Benjamin Petersone711caf2008-06-11 16:44:04 +000099
100
101#### TEST_SEQSPEED
102
103def test_seqspeed(seq):
104 elapsed = 0
105 iterations = 1
106
107 while elapsed < delta:
108 iterations *= 2
109
110 t = _timer()
111
Christian Heimesaae1b702008-11-28 11:23:26 +0000112 for i in range(iterations):
Benjamin Petersone711caf2008-06-11 16:44:04 +0000113 a = seq[5]
114
Raymond Hettinger40fc59d2011-04-26 13:55:55 -0700115 elapsed = _timer() - t
Benjamin Petersone711caf2008-06-11 16:44:04 +0000116
Christian Heimesaae1b702008-11-28 11:23:26 +0000117 print(iterations, 'iterations in', elapsed, 'seconds')
118 print('average number/sec:', iterations/elapsed)
Benjamin Petersone711caf2008-06-11 16:44:04 +0000119
120
121#### TEST_LOCK
122
123def test_lockspeed(l):
124 elapsed = 0
125 iterations = 1
126
127 while elapsed < delta:
128 iterations *= 2
129
130 t = _timer()
131
Christian Heimesaae1b702008-11-28 11:23:26 +0000132 for i in range(iterations):
Benjamin Petersone711caf2008-06-11 16:44:04 +0000133 l.acquire()
134 l.release()
135
Raymond Hettinger40fc59d2011-04-26 13:55:55 -0700136 elapsed = _timer() - t
Benjamin Petersone711caf2008-06-11 16:44:04 +0000137
Christian Heimesaae1b702008-11-28 11:23:26 +0000138 print(iterations, 'iterations in', elapsed, 'seconds')
139 print('average number/sec:', iterations/elapsed)
Benjamin Petersone711caf2008-06-11 16:44:04 +0000140
141
142#### TEST_CONDITION
143
144def conditionspeed_func(c, N):
145 c.acquire()
146 c.notify()
147
Christian Heimesaae1b702008-11-28 11:23:26 +0000148 for i in range(N):
Benjamin Petersone711caf2008-06-11 16:44:04 +0000149 c.wait()
150 c.notify()
151
152 c.release()
153
154def test_conditionspeed(Process, c):
155 elapsed = 0
156 iterations = 1
157
158 while elapsed < delta:
159 iterations *= 2
160
161 c.acquire()
162 p = Process(target=conditionspeed_func, args=(c, iterations))
163 p.start()
164
165 c.wait()
166
167 t = _timer()
168
Christian Heimesaae1b702008-11-28 11:23:26 +0000169 for i in range(iterations):
Benjamin Petersone711caf2008-06-11 16:44:04 +0000170 c.notify()
171 c.wait()
172
Raymond Hettinger40fc59d2011-04-26 13:55:55 -0700173 elapsed = _timer() - t
Benjamin Petersone711caf2008-06-11 16:44:04 +0000174
175 c.release()
176 p.join()
177
Christian Heimesaae1b702008-11-28 11:23:26 +0000178 print(iterations * 2, 'waits in', elapsed, 'seconds')
179 print('average number/sec:', iterations * 2 / elapsed)
Benjamin Petersone711caf2008-06-11 16:44:04 +0000180
181####
182
183def test():
184 manager = multiprocessing.Manager()
185
186 gc.disable()
187
Christian Heimesaae1b702008-11-28 11:23:26 +0000188 print('\n\t######## testing Queue.Queue\n')
189 test_queuespeed(threading.Thread, queue.Queue(),
Benjamin Petersone711caf2008-06-11 16:44:04 +0000190 threading.Condition())
Christian Heimesaae1b702008-11-28 11:23:26 +0000191 print('\n\t######## testing multiprocessing.Queue\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000192 test_queuespeed(multiprocessing.Process, multiprocessing.Queue(),
193 multiprocessing.Condition())
Christian Heimesaae1b702008-11-28 11:23:26 +0000194 print('\n\t######## testing Queue managed by server process\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000195 test_queuespeed(multiprocessing.Process, manager.Queue(),
196 manager.Condition())
Christian Heimesaae1b702008-11-28 11:23:26 +0000197 print('\n\t######## testing multiprocessing.Pipe\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000198 test_pipespeed()
199
Christian Heimesaae1b702008-11-28 11:23:26 +0000200 print()
Benjamin Petersone711caf2008-06-11 16:44:04 +0000201
Christian Heimesaae1b702008-11-28 11:23:26 +0000202 print('\n\t######## testing list\n')
203 test_seqspeed(list(range(10)))
204 print('\n\t######## testing list managed by server process\n')
205 test_seqspeed(manager.list(list(range(10))))
206 print('\n\t######## testing Array("i", ..., lock=False)\n')
207 test_seqspeed(multiprocessing.Array('i', list(range(10)), lock=False))
208 print('\n\t######## testing Array("i", ..., lock=True)\n')
209 test_seqspeed(multiprocessing.Array('i', list(range(10)), lock=True))
Benjamin Petersone711caf2008-06-11 16:44:04 +0000210
Christian Heimesaae1b702008-11-28 11:23:26 +0000211 print()
Benjamin Petersone711caf2008-06-11 16:44:04 +0000212
Christian Heimesaae1b702008-11-28 11:23:26 +0000213 print('\n\t######## testing threading.Lock\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000214 test_lockspeed(threading.Lock())
Christian Heimesaae1b702008-11-28 11:23:26 +0000215 print('\n\t######## testing threading.RLock\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000216 test_lockspeed(threading.RLock())
Christian Heimesaae1b702008-11-28 11:23:26 +0000217 print('\n\t######## testing multiprocessing.Lock\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000218 test_lockspeed(multiprocessing.Lock())
Christian Heimesaae1b702008-11-28 11:23:26 +0000219 print('\n\t######## testing multiprocessing.RLock\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000220 test_lockspeed(multiprocessing.RLock())
Christian Heimesaae1b702008-11-28 11:23:26 +0000221 print('\n\t######## testing lock managed by server process\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000222 test_lockspeed(manager.Lock())
Christian Heimesaae1b702008-11-28 11:23:26 +0000223 print('\n\t######## testing rlock managed by server process\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000224 test_lockspeed(manager.RLock())
225
Christian Heimesaae1b702008-11-28 11:23:26 +0000226 print()
Benjamin Petersone711caf2008-06-11 16:44:04 +0000227
Christian Heimesaae1b702008-11-28 11:23:26 +0000228 print('\n\t######## testing threading.Condition\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000229 test_conditionspeed(threading.Thread, threading.Condition())
Christian Heimesaae1b702008-11-28 11:23:26 +0000230 print('\n\t######## testing multiprocessing.Condition\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000231 test_conditionspeed(multiprocessing.Process, multiprocessing.Condition())
Christian Heimesaae1b702008-11-28 11:23:26 +0000232 print('\n\t######## testing condition managed by a server process\n')
Benjamin Petersone711caf2008-06-11 16:44:04 +0000233 test_conditionspeed(multiprocessing.Process, manager.Condition())
234
235 gc.enable()
236
237if __name__ == '__main__':
238 multiprocessing.freeze_support()
239 test()