diff --git a/benchmarks/context.py b/benchmarks/context.py new file mode 100644 index 0000000..c237528 --- /dev/null +++ b/benchmarks/context.py @@ -0,0 +1,92 @@ +"""Test context switching performance of threading and eventlet""" + +import threading +import time + +import eventlet +from eventlet import hubs +from eventlet.hubs import pyevent, epolls, poll, selects + + +CONTEXT_SWITCHES = 100000 + +def run(event, wait_event): + counter = 0 + while counter <= CONTEXT_SWITCHES: + wait_event.wait() + wait_event.reset() + counter += 1 + event.send() + +def test_eventlet(): + event1 = eventlet.event.Event() + event2 = eventlet.event.Event() + event1.send() + thread1 = eventlet.spawn(run, event1, event2) + thread2 = eventlet.spawn(run, event2, event1) + + thread1.wait() + thread2.wait() + +class BenchThread(threading.Thread): + def __init__(self, event, wait_event): + threading.Thread.__init__(self) + self.counter = 0 + self.event = event + self.wait_event = wait_event + + def run(self): + while self.counter <= CONTEXT_SWITCHES: + self.wait_event.wait() + self.wait_event.clear() + self.counter += 1 + self.event.set() + +def test_thread(): + + event1 = threading.Event() + event2 = threading.Event() + event1.set() + thread1 = BenchThread(event1, event2) + thread2 = BenchThread(event2, event1) + thread1.start() + thread2.start() + thread1.join() + thread2.join() + +print "Testing with %d context switches" % CONTEXT_SWITCHES +start = time.time() +test_thread() +print "threading: %.02f seconds" % (time.time() - start) + +try: + hubs.use_hub(pyevent) + start = time.time() + test_eventlet() + print "pyevent: %.02f seconds" % (time.time() - start) +except: + print "pyevent hub unavailable" + +try: + hubs.use_hub(epolls) + start = time.time() + test_eventlet() + print "epoll: %.02f seconds" % (time.time() - start) +except: + print "epoll hub unavailable" + +try: + hubs.use_hub(poll) + start = time.time() + test_eventlet() + print "poll: %.02f seconds" % (time.time() - start) +except: + print "poll hub unavailable" + +try: + hubs.use_hub(selects) + start = time.time() + test_eventlet() + print "select: %.02f seconds" % (time.time() - start) +except: + print "select hub unavailable"