ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent.pm
(Generate patch)

Comparing AnyEvent/lib/AnyEvent.pm (file contents):
Revision 1.62 by root, Fri Apr 25 02:03:18 2008 UTC vs.
Revision 1.67 by root, Fri Apr 25 06:58:38 2008 UTC

434no warnings; 434no warnings;
435use strict; 435use strict;
436 436
437use Carp; 437use Carp;
438 438
439our $VERSION = '3.2'; 439our $VERSION = '3.3';
440our $MODEL; 440our $MODEL;
441 441
442our $AUTOLOAD; 442our $AUTOLOAD;
443our @ISA; 443our @ISA;
444 444
860 $quit->broadcast; 860 $quit->broadcast;
861 }); 861 });
862 862
863 $quit->wait; 863 $quit->wait;
864 864
865
866=head1 BENCHMARK
867
868To give you an idea of the performance and overheads that AnyEvent adds
869over the backends directly, here is a benchmark of various supported event
870models natively and with anyevent. The benchmark creates a lot of timers
871(with a zero timeout) and io watchers (watching STDOUT, a pty, to become
872writable, which it is), lets them fire exactly once and destroys them
873again.
874
875Explanation of the fields:
876
877I<watcher> is the number of event watchers created/destroyed. Sicne
878different event models have vastly different performance each backend was
879handed a number of watchers so that overall runtime is acceptable and
880similar to all backends (and keep them from crashing).
881
882I<bytes> is the number of bytes (as measured by resident set size) used by
883each watcher.
884
885I<create> is the time, in microseconds, to create a single watcher.
886
887I<invoke> is the time, in microseconds, used to invoke a simple callback
888that simply counts down.
889
890I<destroy> is the time, in microseconds, to destroy a single watcher.
891
892 name watcher bytes create invoke destroy comment
893 EV/EV 400000 244 0.56 0.46 0.31 EV native interface
894 EV/Any 100000 610 3.52 0.91 0.75
895 CoroEV/Any 100000 610 3.49 0.92 0.75 coroutines + Coro::Signal
896 Perl/Any 10000 654 4.64 1.22 0.77 pure perl implementation
897 Event/Event 10000 523 28.05 21.38 5.22 Event native interface
898 Event/Any 10000 943 34.43 20.48 1.39
899 Glib/Any 16000 1357 96.99 12.55 55.51 quadratic behaviour
900 Tk/Any 2000 1855 27.01 66.61 14.03 SEGV with >> 2000 watchers
901 POE/Select 2000 6343 94.69 807.65 562.69 POE::Loop::Select
902 POE/Event 2000 6644 108.15 768.19 14.33 POE::Loop::Event
903
904Discussion: The benchmark does I<not> bench scalability of the
905backend. For example a select-based backend (such as the pureperl one) can
906never compete with a backend using epoll. In this benchmark, only a single
907filehandle is used.
908
909EV is the sole leader regarding speed and memory use, which are both
910maximal/minimal. Even when going through AnyEvent, there is only one event
911loop that uses less memory (the Event module natively), and no faster
912event model.
913
914The pure perl implementation is hit in a few sweet spots (both the
915zero timeout and the use of a single fd hit optimisations in the perl
916interpreter and the backend itself), but it shows that it adds very little
917overhead in itself. Like any select-based backend it's performance becomes
918really bad with lots of file descriptors.
919
920The Event module has a relatively high setup and callback invocation cost,
921but overall scores on the third place.
922
923Glib has a little higher memory cost, a bit fster callback invocation and
924has a similar speed as Event.
925
926The Tk backend works relatively well, the fact that it crashes with
927more than 2000 watchers is a big setback, however, as correctness takes
928precedence over speed.
929
930POE, regardless of backend (wether it's pure perl select backend or the
931Event backend) shows abysmal performance and memory usage: Watchers use
932almost 30 times as much memory as EV watchers, and 10 times as much memory
933as both Event or EV via AnyEvent.
934
935Summary: using EV through AnyEvent is faster than any other event
936loop. The overhead AnyEvent adds can be very small, and you should avoid
937POE like the plague if you want performance or reasonable memory usage.
938
939
865=head1 FORK 940=head1 FORK
866 941
867Most event libraries are not fork-safe. The ones who are usually are 942Most event libraries are not fork-safe. The ones who are usually are
868because they are so inefficient. Only L<EV> is fully fork-aware. 943because they are so inefficient. Only L<EV> is fully fork-aware.
869 944
870If you have to fork, you must either do so I<before> creating your first 945If you have to fork, you must either do so I<before> creating your first
871watcher OR you must not use AnyEvent at all in the child. 946watcher OR you must not use AnyEvent at all in the child.
947
872 948
873=head1 SECURITY CONSIDERATIONS 949=head1 SECURITY CONSIDERATIONS
874 950
875AnyEvent can be forced to load any event model via 951AnyEvent can be forced to load any event model via
876$ENV{PERL_ANYEVENT_MODEL}. While this cannot (to my knowledge) be used to 952$ENV{PERL_ANYEVENT_MODEL}. While this cannot (to my knowledge) be used to
884 960
885 BEGIN { delete $ENV{PERL_ANYEVENT_MODEL} } 961 BEGIN { delete $ENV{PERL_ANYEVENT_MODEL} }
886 962
887 use AnyEvent; 963 use AnyEvent;
888 964
965
889=head1 SEE ALSO 966=head1 SEE ALSO
890 967
891Event modules: L<Coro::EV>, L<EV>, L<EV::Glib>, L<Glib::EV>, 968Event modules: L<Coro::EV>, L<EV>, L<EV::Glib>, L<Glib::EV>,
892L<Coro::Event>, L<Event>, L<Glib::Event>, L<Glib>, L<Coro>, L<Tk>, 969L<Coro::Event>, L<Event>, L<Glib::Event>, L<Glib>, L<Coro>, L<Tk>,
893L<Event::Lib>, L<Qt>, L<POE>. 970L<Event::Lib>, L<Qt>, L<POE>.
897L<AnyEvent::Impl::Tk>, L<AnyEvent::Impl::Perl>, L<AnyEvent::Impl::EventLib>, 974L<AnyEvent::Impl::Tk>, L<AnyEvent::Impl::Perl>, L<AnyEvent::Impl::EventLib>,
898L<AnyEvent::Impl::Qt>, L<AnyEvent::Impl::POE>. 975L<AnyEvent::Impl::Qt>, L<AnyEvent::Impl::POE>.
899 976
900Nontrivial usage examples: L<Net::FCP>, L<Net::XMPP2>. 977Nontrivial usage examples: L<Net::FCP>, L<Net::XMPP2>.
901 978
979
902=head1 AUTHOR 980=head1 AUTHOR
903 981
904 Marc Lehmann <schmorp@schmorp.de> 982 Marc Lehmann <schmorp@schmorp.de>
905 http://home.schmorp.de/ 983 http://home.schmorp.de/
906 984

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines