While event loops should scale (and select-based ones do not...) even to
large servers, most programs we (or I :) actually write have only a few
I/O watchers.
In this benchmark, I use the same benchmark program as in the large server
case, but it uses only eight "servers", of which three are active at any
one time. This should reflect performance for a small server relatively
well.
The columns are identical to the previous table.
=head3 Results
name sockets create request
EV 16 20.00 6.54
Perl 16 25.75 12.62
Event 16 81.27 35.86
Glib 16 32.63 15.48
POE 16 261.87 276.28 uses POE::Loop::Event
=head3 Discussion
The benchmark tries to test the performance of a typical small
server. While knowing how various event loops perform is interesting, keep
in mind that their overhead in this case is usually not as important, due
to the small absolute number of watchers (that is, you need efficiency and
speed most when you have lots of watchers, not when you only have a few of
them).
EV is again fastest.
Perl again comes second. It is noticeably faster than the C-based event
loops Event and Glib, although the difference is too small to really
matter.
POE also performs much better in this case, but is is still far behind the
others.
=head3 Summary
=over 4
=item * C-based event loops perform very well with small number of
watchers, as the management overhead dominates.
=back
=head1 FORK
Most event libraries are not fork-safe. The ones who are usually are
because they rely on inefficient but fork-safe C<select> or C<poll>
calls. Only L<EV> is fully fork-aware.
If you have to fork, you must either do so I<before> 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
$ENV{PERL_ANYEVENT_MODEL}. While this cannot (to my knowledge) be used to
execute arbitrary code or directly gain access, it can easily be used to
make the program hang or malfunction in subtle ways, as AnyEvent watchers
will not be active when the program uses a different event model than
specified in the variable.
You can make AnyEvent completely ignore this variable by deleting it
before the first watcher gets created, e.g. with a C<BEGIN> block:
BEGIN { delete $ENV{PERL_ANYEVENT_MODEL} }
use AnyEvent;
Similar considerations apply to $ENV{PERL_ANYEVENT_VERBOSE}, as that can
be used to probe what backend is used and gain other information (which is
probably even less useful to an attacker than PERL_ANYEVENT_MODEL).
=head1 BUGS
Perl 5.8 has numerous memleaks that sometimes hit this module and are hard
to work around. If you suffer from memleaks, first upgrade to Perl 5.10
and check wether the leaks still show up. (Perl 5.10.0 has other annoying
mamleaks, such as leaking on C<map> and C<grep> but it is usually not as
pronounced).
=head1 SEE ALSO
Utility functions: L<AnyEvent::Util>.
Event modules: L<EV>, L<EV::Glib>, L<Glib::EV>, L<Event>, L<Glib::Event>,
L<Glib>, L<Tk>, L<Event::Lib>, L<Qt>, L<POE>.
Implementations: L<AnyEvent::Impl::EV>, L<AnyEvent::Impl::Event>,
L<AnyEvent::Impl::Glib>, L<AnyEvent::Impl::Tk>, L<AnyEvent::Impl::Perl>,
L<AnyEvent::Impl::EventLib>, L<AnyEvent::Impl::Qt>,
L<AnyEvent::Impl::POE>.
=17= |