--- AnyEvent/lib/AnyEvent.pm 2008/04/25 02:03:38 1.63 +++ AnyEvent/lib/AnyEvent.pm 2008/04/25 06:54:08 1.64 @@ -862,6 +862,79 @@ $quit->wait; + +=head1 BENCHMARK + +To give you an idea of the performance an doverheads that AnyEvent adds +over the backends, here is a benchmark of various supported backends. The +benchmark creates a lot of timers (with zero timeout) and io events +(watching STDOUT, a pty, to become writable). + +Explanation of the fields: + +I is the number of event watchers created/destroyed. Sicne +different event models have vastly different performance each backend was +handed a number of watchers so that overall runtime is acceptable and +similar to all backends (and keep them from crashing). + +I is the number of bytes (as measured by resident set size) used by +each watcher. + +I is the time, in microseconds, to create a single watcher. + +I is the time, in microseconds, used to invoke a simple callback +that simply counts down. + +I is the time, in microseconds, to destroy a single watcher. + + name watcher bytes create invoke destroy comment + EV/EV 400000 244 0.56 0.46 0.31 EV native interface + EV/Any 100000 610 3.52 0.91 0.75 + CoroEV/Any 100000 610 3.49 0.92 0.75 coroutines + Coro::Signal + Perl/Any 10000 654 4.64 1.22 0.77 pure perl implementation + Event/Event 10000 523 28.05 21.38 5.22 Event native interface + Event/Any 10000 943 34.43 20.48 1.39 + Glib/Any 16000 1357 96.99 12.55 55.51 quadratic behaviour + Tk/Any 2000 1855 27.01 66.61 14.03 SEGV with >> 2000 watchers + POE/Select 2000 6343 94.69 807.65 562.69 POE::Loop::Select + POE/Event 2000 6644 108.15 768.19 14.33 POE::Loop::Event + +Discussion: The benchmark does I bench scalability of the +backend. For example a select-based backend (such as the pureperl one) can +never compete with a backend using epoll. In this benchmark, only a single +filehandle is used. + +EV is the sole leader regarding speed and memory use, which are both +maximal/minimal. Even when going through AnyEvent, there is only one event +loop that uses less memory (the Event module natively), and no faster +event model. + +The pure perl implementation is hit in a few sweet spots (both the +zero timeout and the use of a single fd hit optimisations in the perl +interpreter and the backend itself), but it shows that it adds very little +overhead in itself. Like any select-based backend it's performance becomes +really bad with lots of file descriptors. + +The Event module has a relatively high setup and callback invocation cost, +but overall scores on the third place. + +Glib has a little higher memory cost, a bit fster callback invocation and +has a similar speed as Event. + +The Tk backend works relatively well, the fact that it crashes with +more than 2000 watchers is a big setback, however, as correctness takes +precedence over speed. + +POE, regardless of backend (wether it's pure perl select backend or the +Event backend) shows abysmal performance and memory usage: Watchers use +almost 30 times as much memory as EV watchers, and 10 times as much memory +as both Event or EV via AnyEvent. + +Summary: using EV through AnyEvent is faster than any other event +loop. The overhead AnyEvent adds can be very small, and you should avoid +POE like the plague if you want performance or reasonable memory usage. + + =head1 FORK Most event libraries are not fork-safe. The ones who are usually are @@ -870,6 +943,7 @@ If you have to fork, you must either do so I creating your first watcher OR you must not use AnyEvent at all in the child. + =head1 SECURITY CONSIDERATIONS AnyEvent can be forced to load any event model via @@ -886,6 +960,7 @@ use AnyEvent; + =head1 SEE ALSO Event modules: L, L, L, L, @@ -899,6 +974,7 @@ Nontrivial usage examples: L, L. + =head1 AUTHOR Marc Lehmann