… | |
… | |
777 | |
777 | |
778 | AnyEvent::IGS |
778 | AnyEvent::IGS |
779 | A non-blocking interface to the Internet Go Server protocol (used by |
779 | A non-blocking interface to the Internet Go Server protocol (used by |
780 | App::IGS). |
780 | App::IGS). |
781 | |
781 | |
|
|
782 | AnyEvent::IRC |
|
|
783 | AnyEvent based IRC client module family (replacing the older |
782 | Net::IRC3 |
784 | Net::IRC3). |
783 | AnyEvent based IRC client module family. |
|
|
784 | |
785 | |
785 | Net::XMPP2 |
786 | Net::XMPP2 |
786 | AnyEvent based XMPP (Jabber protocol) module family. |
787 | AnyEvent based XMPP (Jabber protocol) module family. |
787 | |
788 | |
788 | Net::FCP |
789 | Net::FCP |
… | |
… | |
869 | mentioned will be used, and preference will be given to protocols |
870 | mentioned will be used, and preference will be given to protocols |
870 | mentioned earlier in the list. |
871 | mentioned earlier in the list. |
871 | |
872 | |
872 | This variable can effectively be used for denial-of-service attacks |
873 | This variable can effectively be used for denial-of-service attacks |
873 | against local programs (e.g. when setuid), although the impact is |
874 | against local programs (e.g. when setuid), although the impact is |
874 | likely small, as the program has to handle connection errors |
875 | likely small, as the program has to handle conenction and other |
875 | already- |
876 | failures anyways. |
876 | |
877 | |
877 | Examples: "PERL_ANYEVENT_PROTOCOLS=ipv4,ipv6" - prefer IPv4 over |
878 | Examples: "PERL_ANYEVENT_PROTOCOLS=ipv4,ipv6" - prefer IPv4 over |
878 | IPv6, but support both and try to use both. |
879 | IPv6, but support both and try to use both. |
879 | "PERL_ANYEVENT_PROTOCOLS=ipv4" - only support IPv4, never try to |
880 | "PERL_ANYEVENT_PROTOCOLS=ipv4" - only support IPv4, never try to |
880 | resolve or contact IPv6 addresses. |
881 | resolve or contact IPv6 addresses. |
… | |
… | |
1130 | *destroy* is the time, in microseconds, that it takes to destroy a |
1131 | *destroy* is the time, in microseconds, that it takes to destroy a |
1131 | single watcher. |
1132 | single watcher. |
1132 | |
1133 | |
1133 | Results |
1134 | Results |
1134 | name watchers bytes create invoke destroy comment |
1135 | name watchers bytes create invoke destroy comment |
1135 | EV/EV 400000 244 0.56 0.46 0.31 EV native interface |
1136 | EV/EV 400000 224 0.47 0.35 0.27 EV native interface |
1136 | EV/Any 100000 244 2.50 0.46 0.29 EV + AnyEvent watchers |
1137 | EV/Any 100000 224 2.88 0.34 0.27 EV + AnyEvent watchers |
1137 | CoroEV/Any 100000 244 2.49 0.44 0.29 coroutines + Coro::Signal |
1138 | CoroEV/Any 100000 224 2.85 0.35 0.28 coroutines + Coro::Signal |
1138 | Perl/Any 100000 513 4.92 0.87 1.12 pure perl implementation |
1139 | Perl/Any 100000 452 4.13 0.73 0.95 pure perl implementation |
1139 | Event/Event 16000 516 31.88 31.30 0.85 Event native interface |
1140 | Event/Event 16000 517 32.20 31.80 0.81 Event native interface |
1140 | Event/Any 16000 590 35.75 31.42 1.08 Event + AnyEvent watchers |
1141 | Event/Any 16000 590 35.85 31.55 1.06 Event + AnyEvent watchers |
1141 | Glib/Any 16000 1357 98.22 12.41 54.00 quadratic behaviour |
1142 | Glib/Any 16000 1357 102.33 12.31 51.00 quadratic behaviour |
1142 | Tk/Any 2000 1860 26.97 67.98 14.00 SEGV with >> 2000 watchers |
1143 | Tk/Any 2000 1860 27.20 66.31 14.00 SEGV with >> 2000 watchers |
1143 | POE/Event 2000 6644 108.64 736.02 14.73 via POE::Loop::Event |
1144 | POE/Event 2000 6328 109.99 751.67 14.02 via POE::Loop::Event |
1144 | POE/Select 2000 6343 94.13 809.12 565.96 via POE::Loop::Select |
1145 | POE/Select 2000 6027 94.54 809.13 579.80 via POE::Loop::Select |
1145 | |
1146 | |
1146 | Discussion |
1147 | Discussion |
1147 | The benchmark does *not* measure scalability of the event loop very |
1148 | The benchmark does *not* measure scalability of the event loop very |
1148 | well. For example, a select-based event loop (such as the pure perl one) |
1149 | well. For example, a select-based event loop (such as the pure perl one) |
1149 | can never compete with an event loop that uses epoll when the number of |
1150 | can never compete with an event loop that uses epoll when the number of |
… | |
… | |
1330 | |
1331 | |
1331 | Summary |
1332 | Summary |
1332 | * C-based event loops perform very well with small number of watchers, |
1333 | * C-based event loops perform very well with small number of watchers, |
1333 | as the management overhead dominates. |
1334 | as the management overhead dominates. |
1334 | |
1335 | |
|
|
1336 | SIGNALS |
|
|
1337 | AnyEvent currently installs handlers for these signals: |
|
|
1338 | |
|
|
1339 | SIGCHLD |
|
|
1340 | A handler for "SIGCHLD" is installed by AnyEvent's child watcher |
|
|
1341 | emulation for event loops that do not support them natively. Also, |
|
|
1342 | some event loops install a similar handler. |
|
|
1343 | |
|
|
1344 | SIGPIPE |
|
|
1345 | A no-op handler is installed for "SIGPIPE" when $SIG{PIPE} is |
|
|
1346 | "undef" when AnyEvent gets loaded. |
|
|
1347 | |
|
|
1348 | The rationale for this is that AnyEvent users usually do not really |
|
|
1349 | depend on SIGPIPE delivery (which is purely an optimisation for |
|
|
1350 | shell use, or badly-written programs), but "SIGPIPE" can cause |
|
|
1351 | spurious and rare program exits as a lot of people do not expect |
|
|
1352 | "SIGPIPE" when writing to some random socket. |
|
|
1353 | |
|
|
1354 | The rationale for installing a no-op handler as opposed to ignoring |
|
|
1355 | it is that this way, the handler will be restored to defaults on |
|
|
1356 | exec. |
|
|
1357 | |
|
|
1358 | Feel free to install your own handler, or reset it to defaults. |
|
|
1359 | |
1335 | FORK |
1360 | FORK |
1336 | Most event libraries are not fork-safe. The ones who are usually are |
1361 | Most event libraries are not fork-safe. The ones who are usually are |
1337 | because they rely on inefficient but fork-safe "select" or "poll" calls. |
1362 | because they rely on inefficient but fork-safe "select" or "poll" calls. |
1338 | Only EV is fully fork-aware. |
1363 | Only EV is fully fork-aware. |
1339 | |
1364 | |