118 lines
3.5 KiB
Python
118 lines
3.5 KiB
Python
"""Benchmark evaluating eventlet's performance at speaking to itself over a localhost socket."""
|
|
from __future__ import print_function
|
|
|
|
import time
|
|
|
|
import benchmarks
|
|
from eventlet.support import six
|
|
|
|
|
|
BYTES = 1000
|
|
SIZE = 1
|
|
CONCURRENCY = 50
|
|
TRIES = 5
|
|
|
|
|
|
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 six.moves.range(CONCURRENCY):
|
|
sock, addr = server_sock.accept()
|
|
pool.spawn_n(reader, sock)
|
|
|
|
|
|
def heavy_accepter(server_sock, pool):
|
|
for i in six.moves.range(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 six.moves.range(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 six.moves.range(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)
|
|
parser.add_option('-t', '--tries', type='int', dest='tries',
|
|
default=TRIES)
|
|
|
|
opts, args = parser.parse_args()
|
|
BYTES = opts.bytes
|
|
SIZE = opts.size
|
|
CONCURRENCY = opts.concurrency
|
|
TRIES = opts.tries
|
|
|
|
funcs = [launch_green_threads]
|
|
if opts.threading:
|
|
funcs = [launch_green_threads, launch_heavy_threads]
|
|
results = benchmarks.measure_best(TRIES, 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)
|