diff options
author | Ryan Williams <rdw@lindenlab.com> | 2010-01-21 00:37:03 -0500 |
---|---|---|
committer | Ryan Williams <rdw@lindenlab.com> | 2010-01-21 00:37:03 -0500 |
commit | e60a78444c0be333f49232ebc9bcab0be261e35a (patch) | |
tree | 5bd58a26157f2eedd804351c7dc5b11dcd1ee2f1 /benchmarks | |
parent | 5b8acc850fe8ac2becc79c9053db1ac9e0ca6296 (diff) | |
download | eventlet-e60a78444c0be333f49232ebc9bcab0be261e35a.tar.gz |
Added debug control over exceptions in greenpool, benchmarks directory.
Diffstat (limited to 'benchmarks')
-rw-r--r-- | benchmarks/__init__.py | 24 | ||||
-rw-r--r-- | benchmarks/localhost_socket.py | 100 | ||||
-rw-r--r-- | benchmarks/spawn.py | 56 |
3 files changed, 180 insertions, 0 deletions
diff --git a/benchmarks/__init__.py b/benchmarks/__init__.py new file mode 100644 index 0000000..b2ca444 --- /dev/null +++ b/benchmarks/__init__.py @@ -0,0 +1,24 @@ +import gc +import timeit +import random + +def measure_best(repeat, iters, + common_setup='pass', + common_cleanup='pass', + *funcs): + funcs = list(funcs) + results = dict([(f,[]) for f in funcs]) + + for i in xrange(repeat): + random.shuffle(funcs) + for func in funcs: + gc.collect() + t = timeit.Timer(func, setup=common_setup) + results[func].append(t.timeit(iters)) + common_cleanup() + + best_results = {} + for func, times in results.iteritems(): + best_results[func] = min(times) + return best_results +
\ No newline at end of file diff --git a/benchmarks/localhost_socket.py b/benchmarks/localhost_socket.py new file mode 100644 index 0000000..f249255 --- /dev/null +++ b/benchmarks/localhost_socket.py @@ -0,0 +1,100 @@ +"""Benchmark evaluating eventlet's performance at speaking to itself over a localhost socket.""" + +import time +import benchmarks + +BYTES=1000 +SIZE=1 +CONCURRENCY=50 + +def reader(sock): + expect = BYTES + while expect > 0: + d = sock.recv(min(expect, SIZE)) + expect -= len(d) + +def writer(addr, socket_impl): + sock = socket_impl(socket.AF_INET, socket.SOCK_STREAM) + sock.connect(addr) + sent = 0 + while sent < BYTES: + d = 'xy' * (max(min(SIZE/2, BYTES-sent), 1)) + sock.sendall(d) + sent += len(d) + + +def green_accepter(server_sock, pool): + for i in xrange(CONCURRENCY): + sock, addr = server_sock.accept() + pool.spawn_n(reader, sock) + +def heavy_accepter(server_sock, pool): + for i in xrange(CONCURRENCY): + sock, addr = server_sock.accept() + t = threading.Thread(None, reader, "reader thread", (sock,)) + t.start() + pool.append(t) + +import eventlet.green.socket +import eventlet + +from eventlet import debug +debug.hub_exceptions(True) + +def launch_green_threads(): + pool = eventlet.GreenPool(CONCURRENCY * 2 + 1) + server_sock = eventlet.green.socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server_sock.bind(('localhost', 0)) + server_sock.listen(50) + addr = ('localhost', server_sock.getsockname()[1]) + pool.spawn_n(green_accepter, server_sock, pool) + for i in xrange(CONCURRENCY): + pool.spawn_n(writer, addr, eventlet.green.socket.socket) + pool.waitall() + +import threading +import socket + +def launch_heavy_threads(): + threads = [] + server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server_sock.bind(('localhost', 0)) + server_sock.listen(50) + addr = ('localhost', server_sock.getsockname()[1]) + accepter_thread = threading.Thread(None, heavy_accepter, "accepter thread", (server_sock, threads)) + accepter_thread.start() + threads.append(accepter_thread) + for i in xrange(CONCURRENCY): + client_thread = threading.Thread(None, writer, "writer thread", (addr, socket.socket)) + client_thread.start() + threads.append(client_thread) + for t in threads: + t.join() + + +if __name__ == "__main__": + import optparse + parser = optparse.OptionParser() + parser.add_option('--compare-threading', action='store_true', dest='threading', default=False) + parser.add_option('-b', '--bytes', type='int', dest='bytes', + default=BYTES) + parser.add_option('-s', '--size', type='int', dest='size', + default=SIZE) + parser.add_option('-c', '--concurrency', type='int', dest='concurrency', + default=CONCURRENCY) + + opts, args = parser.parse_args() + BYTES=opts.bytes + SIZE=opts.size + CONCURRENCY=opts.concurrency + + funcs = [launch_green_threads] + if opts.threading: + funcs = [launch_green_threads, launch_heavy_threads] + results = benchmarks.measure_best(3, 3, + lambda: None, lambda: None, + *funcs) + print "green:", results[launch_green_threads] + if opts.threading: + print "threads:", results[launch_heavy_threads] + print "%", (results[launch_green_threads]-results[launch_heavy_threads])/results[launch_heavy_threads] * 100
\ No newline at end of file diff --git a/benchmarks/spawn.py b/benchmarks/spawn.py new file mode 100644 index 0000000..52762dc --- /dev/null +++ b/benchmarks/spawn.py @@ -0,0 +1,56 @@ +"""Compare spawn to spawn_n""" + +import eventlet +import benchmarks + +def dummy(i=None): + return i + +def run_spawn(): + eventlet.spawn(dummy, 1) + +def run_spawn_n(): + eventlet.spawn_n(dummy, 1) + +def run_spawn_n_kw(): + eventlet.spawn_n(dummy, i=1) + +def cleanup(): + eventlet.sleep(0.2) + +iters = 10000 +best = benchmarks.measure_best(5, iters, + 'pass', + cleanup, + run_spawn_n, + run_spawn, + run_spawn_n_kw) +print "eventlet.spawn", best[run_spawn] +print "eventlet.spawn_n", best[run_spawn_n] +print "eventlet.spawn_n(**kw)", best[run_spawn_n_kw] +print "%% %0.1f" % ((best[run_spawn]-best[run_spawn_n])/best[run_spawn_n] * 100) + +pool = None +def setup(): + global pool + pool = eventlet.GreenPool(iters) + +def run_pool_spawn(): + pool.spawn(dummy, 1) + +def run_pool_spawn_n(): + pool.spawn_n(dummy, 1) + +def cleanup_pool(): + pool.waitall() + + +best = benchmarks.measure_best(3, iters, + setup, + cleanup_pool, + run_pool_spawn, + run_pool_spawn_n, +) +print "eventlet.GreenPool.spawn", best[run_pool_spawn] +print "eventlet.GreenPool.spawn_n", best[run_pool_spawn_n] +print "%% %0.1f" % ((best[run_pool_spawn]-best[run_pool_spawn_n])/best[run_pool_spawn_n] * 100) |