… | |
… | |
860 | $quit->broadcast; |
860 | $quit->broadcast; |
861 | }); |
861 | }); |
862 | |
862 | |
863 | $quit->wait; |
863 | $quit->wait; |
864 | |
864 | |
|
|
865 | |
|
|
866 | =head1 BENCHMARK |
|
|
867 | |
|
|
868 | To give you an idea of the performance and overheads that AnyEvent adds |
|
|
869 | over the backends directly, here is a benchmark of various supported event |
|
|
870 | models 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 |
|
|
872 | writable, which it is), lets them fire exactly once and destroys them |
|
|
873 | again. |
|
|
874 | |
|
|
875 | Explanation of the fields: |
|
|
876 | |
|
|
877 | I<watcher> is the number of event watchers created/destroyed. Sicne |
|
|
878 | different event models have vastly different performance each backend was |
|
|
879 | handed a number of watchers so that overall runtime is acceptable and |
|
|
880 | similar to all backends (and keep them from crashing). |
|
|
881 | |
|
|
882 | I<bytes> is the number of bytes (as measured by resident set size) used by |
|
|
883 | each watcher. |
|
|
884 | |
|
|
885 | I<create> is the time, in microseconds, to create a single watcher. |
|
|
886 | |
|
|
887 | I<invoke> is the time, in microseconds, used to invoke a simple callback |
|
|
888 | that simply counts down. |
|
|
889 | |
|
|
890 | I<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 | |
|
|
904 | Discussion: The benchmark does I<not> bench scalability of the |
|
|
905 | backend. For example a select-based backend (such as the pureperl one) can |
|
|
906 | never compete with a backend using epoll. In this benchmark, only a single |
|
|
907 | filehandle is used. |
|
|
908 | |
|
|
909 | EV is the sole leader regarding speed and memory use, which are both |
|
|
910 | maximal/minimal. Even when going through AnyEvent, there is only one event |
|
|
911 | loop that uses less memory (the Event module natively), and no faster |
|
|
912 | event model. |
|
|
913 | |
|
|
914 | The pure perl implementation is hit in a few sweet spots (both the |
|
|
915 | zero timeout and the use of a single fd hit optimisations in the perl |
|
|
916 | interpreter and the backend itself), but it shows that it adds very little |
|
|
917 | overhead in itself. Like any select-based backend it's performance becomes |
|
|
918 | really bad with lots of file descriptors. |
|
|
919 | |
|
|
920 | The Event module has a relatively high setup and callback invocation cost, |
|
|
921 | but overall scores on the third place. |
|
|
922 | |
|
|
923 | Glib has a little higher memory cost, a bit fster callback invocation and |
|
|
924 | has a similar speed as Event. |
|
|
925 | |
|
|
926 | The Tk backend works relatively well, the fact that it crashes with |
|
|
927 | more than 2000 watchers is a big setback, however, as correctness takes |
|
|
928 | precedence over speed. |
|
|
929 | |
|
|
930 | POE, regardless of backend (wether it's pure perl select backend or the |
|
|
931 | Event backend) shows abysmal performance and memory usage: Watchers use |
|
|
932 | almost 30 times as much memory as EV watchers, and 10 times as much memory |
|
|
933 | as both Event or EV via AnyEvent. |
|
|
934 | |
|
|
935 | Summary: using EV through AnyEvent is faster than any other event |
|
|
936 | loop. The overhead AnyEvent adds can be very small, and you should avoid |
|
|
937 | POE like the plague if you want performance or reasonable memory usage. |
|
|
938 | |
|
|
939 | |
865 | =head1 FORK |
940 | =head1 FORK |
866 | |
941 | |
867 | Most event libraries are not fork-safe. The ones who are usually are |
942 | Most event libraries are not fork-safe. The ones who are usually are |
868 | because they are so inefficient. Only L<EV> is fully fork-aware. |
943 | because they are so inefficient. Only L<EV> is fully fork-aware. |
869 | |
944 | |
870 | If you have to fork, you must either do so I<before> creating your first |
945 | If you have to fork, you must either do so I<before> creating your first |
871 | watcher OR you must not use AnyEvent at all in the child. |
946 | watcher OR you must not use AnyEvent at all in the child. |
|
|
947 | |
872 | |
948 | |
873 | =head1 SECURITY CONSIDERATIONS |
949 | =head1 SECURITY CONSIDERATIONS |
874 | |
950 | |
875 | AnyEvent can be forced to load any event model via |
951 | AnyEvent 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 | |
891 | Event modules: L<Coro::EV>, L<EV>, L<EV::Glib>, L<Glib::EV>, |
968 | Event modules: L<Coro::EV>, L<EV>, L<EV::Glib>, L<Glib::EV>, |
892 | L<Coro::Event>, L<Event>, L<Glib::Event>, L<Glib>, L<Coro>, L<Tk>, |
969 | L<Coro::Event>, L<Event>, L<Glib::Event>, L<Glib>, L<Coro>, L<Tk>, |
893 | L<Event::Lib>, L<Qt>, L<POE>. |
970 | L<Event::Lib>, L<Qt>, L<POE>. |
… | |
… | |
897 | L<AnyEvent::Impl::Tk>, L<AnyEvent::Impl::Perl>, L<AnyEvent::Impl::EventLib>, |
974 | L<AnyEvent::Impl::Tk>, L<AnyEvent::Impl::Perl>, L<AnyEvent::Impl::EventLib>, |
898 | L<AnyEvent::Impl::Qt>, L<AnyEvent::Impl::POE>. |
975 | L<AnyEvent::Impl::Qt>, L<AnyEvent::Impl::POE>. |
899 | |
976 | |
900 | Nontrivial usage examples: L<Net::FCP>, L<Net::XMPP2>. |
977 | Nontrivial 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 | |