mirror of
https://github.com/python/cpython.git
synced 2025-07-19 09:15:34 +00:00

mp_benchmarks, mp_newtypes and mp_distribution are still broken but the others are working properly. We should include the examples in our unit test suite ...
235 lines
5.4 KiB
Python
235 lines
5.4 KiB
Python
#
|
|
# Simple benchmarks for the multiprocessing package
|
|
#
|
|
|
|
import time, sys, multiprocessing, threading, queue, gc
|
|
|
|
if sys.platform == 'win32':
|
|
_timer = time.clock
|
|
else:
|
|
_timer = time.time
|
|
|
|
delta = 1
|
|
|
|
|
|
#### TEST_QUEUESPEED
|
|
|
|
def queuespeed_func(q, c, iterations):
|
|
a = '0' * 256
|
|
c.acquire()
|
|
c.notify()
|
|
c.release()
|
|
|
|
for i in range(iterations):
|
|
q.put(a)
|
|
|
|
q.put('STOP')
|
|
|
|
def test_queuespeed(Process, q, c):
|
|
elapsed = 0
|
|
iterations = 1
|
|
|
|
while elapsed < delta:
|
|
iterations *= 2
|
|
|
|
p = Process(target=queuespeed_func, args=(q, c, iterations))
|
|
c.acquire()
|
|
p.start()
|
|
c.wait()
|
|
c.release()
|
|
|
|
result = None
|
|
t = _timer()
|
|
|
|
while result != 'STOP':
|
|
result = q.get()
|
|
|
|
elapsed = _timer() - t
|
|
|
|
p.join()
|
|
|
|
print(iterations, 'objects passed through the queue in', elapsed, 'seconds')
|
|
print('average number/sec:', iterations/elapsed)
|
|
|
|
|
|
#### TEST_PIPESPEED
|
|
|
|
def pipe_func(c, cond, iterations):
|
|
a = '0' * 256
|
|
cond.acquire()
|
|
cond.notify()
|
|
cond.release()
|
|
|
|
for i in range(iterations):
|
|
c.send(a)
|
|
|
|
c.send('STOP')
|
|
|
|
def test_pipespeed():
|
|
c, d = multiprocessing.Pipe()
|
|
cond = multiprocessing.Condition()
|
|
elapsed = 0
|
|
iterations = 1
|
|
|
|
while elapsed < delta:
|
|
iterations *= 2
|
|
|
|
p = multiprocessing.Process(target=pipe_func,
|
|
args=(d, cond, iterations))
|
|
cond.acquire()
|
|
p.start()
|
|
cond.wait()
|
|
cond.release()
|
|
|
|
result = None
|
|
t = _timer()
|
|
|
|
while result != 'STOP':
|
|
result = c.recv()
|
|
|
|
elapsed = _timer() - t
|
|
p.join()
|
|
|
|
print(iterations, 'objects passed through connection in',elapsed,'seconds')
|
|
print('average number/sec:', iterations/elapsed)
|
|
|
|
|
|
#### TEST_SEQSPEED
|
|
|
|
def test_seqspeed(seq):
|
|
elapsed = 0
|
|
iterations = 1
|
|
|
|
while elapsed < delta:
|
|
iterations *= 2
|
|
|
|
t = _timer()
|
|
|
|
for i in range(iterations):
|
|
a = seq[5]
|
|
|
|
elapsed = _timer()-t
|
|
|
|
print(iterations, 'iterations in', elapsed, 'seconds')
|
|
print('average number/sec:', iterations/elapsed)
|
|
|
|
|
|
#### TEST_LOCK
|
|
|
|
def test_lockspeed(l):
|
|
elapsed = 0
|
|
iterations = 1
|
|
|
|
while elapsed < delta:
|
|
iterations *= 2
|
|
|
|
t = _timer()
|
|
|
|
for i in range(iterations):
|
|
l.acquire()
|
|
l.release()
|
|
|
|
elapsed = _timer()-t
|
|
|
|
print(iterations, 'iterations in', elapsed, 'seconds')
|
|
print('average number/sec:', iterations/elapsed)
|
|
|
|
|
|
#### TEST_CONDITION
|
|
|
|
def conditionspeed_func(c, N):
|
|
c.acquire()
|
|
c.notify()
|
|
|
|
for i in range(N):
|
|
c.wait()
|
|
c.notify()
|
|
|
|
c.release()
|
|
|
|
def test_conditionspeed(Process, c):
|
|
elapsed = 0
|
|
iterations = 1
|
|
|
|
while elapsed < delta:
|
|
iterations *= 2
|
|
|
|
c.acquire()
|
|
p = Process(target=conditionspeed_func, args=(c, iterations))
|
|
p.start()
|
|
|
|
c.wait()
|
|
|
|
t = _timer()
|
|
|
|
for i in range(iterations):
|
|
c.notify()
|
|
c.wait()
|
|
|
|
elapsed = _timer()-t
|
|
|
|
c.release()
|
|
p.join()
|
|
|
|
print(iterations * 2, 'waits in', elapsed, 'seconds')
|
|
print('average number/sec:', iterations * 2 / elapsed)
|
|
|
|
####
|
|
|
|
def test():
|
|
manager = multiprocessing.Manager()
|
|
|
|
gc.disable()
|
|
|
|
print('\n\t######## testing Queue.Queue\n')
|
|
test_queuespeed(threading.Thread, queue.Queue(),
|
|
threading.Condition())
|
|
print('\n\t######## testing multiprocessing.Queue\n')
|
|
test_queuespeed(multiprocessing.Process, multiprocessing.Queue(),
|
|
multiprocessing.Condition())
|
|
print('\n\t######## testing Queue managed by server process\n')
|
|
test_queuespeed(multiprocessing.Process, manager.Queue(),
|
|
manager.Condition())
|
|
print('\n\t######## testing multiprocessing.Pipe\n')
|
|
test_pipespeed()
|
|
|
|
print()
|
|
|
|
print('\n\t######## testing list\n')
|
|
test_seqspeed(list(range(10)))
|
|
print('\n\t######## testing list managed by server process\n')
|
|
test_seqspeed(manager.list(list(range(10))))
|
|
print('\n\t######## testing Array("i", ..., lock=False)\n')
|
|
test_seqspeed(multiprocessing.Array('i', list(range(10)), lock=False))
|
|
print('\n\t######## testing Array("i", ..., lock=True)\n')
|
|
test_seqspeed(multiprocessing.Array('i', list(range(10)), lock=True))
|
|
|
|
print()
|
|
|
|
print('\n\t######## testing threading.Lock\n')
|
|
test_lockspeed(threading.Lock())
|
|
print('\n\t######## testing threading.RLock\n')
|
|
test_lockspeed(threading.RLock())
|
|
print('\n\t######## testing multiprocessing.Lock\n')
|
|
test_lockspeed(multiprocessing.Lock())
|
|
print('\n\t######## testing multiprocessing.RLock\n')
|
|
test_lockspeed(multiprocessing.RLock())
|
|
print('\n\t######## testing lock managed by server process\n')
|
|
test_lockspeed(manager.Lock())
|
|
print('\n\t######## testing rlock managed by server process\n')
|
|
test_lockspeed(manager.RLock())
|
|
|
|
print()
|
|
|
|
print('\n\t######## testing threading.Condition\n')
|
|
test_conditionspeed(threading.Thread, threading.Condition())
|
|
print('\n\t######## testing multiprocessing.Condition\n')
|
|
test_conditionspeed(multiprocessing.Process, multiprocessing.Condition())
|
|
print('\n\t######## testing condition managed by a server process\n')
|
|
test_conditionspeed(multiprocessing.Process, manager.Condition())
|
|
|
|
gc.enable()
|
|
|
|
if __name__ == '__main__':
|
|
multiprocessing.freeze_support()
|
|
test()
|