… | |
… | |
899 | I<destroy> is the time, in microseconds, that it takes to destroy a single |
899 | I<destroy> is the time, in microseconds, that it takes to destroy a single |
900 | watcher. |
900 | watcher. |
901 | |
901 | |
902 | =head2 Results |
902 | =head2 Results |
903 | |
903 | |
904 | name watcher bytes create invoke destroy comment |
904 | name watchers bytes create invoke destroy comment |
905 | EV/EV 400000 244 0.56 0.46 0.31 EV native interface |
905 | EV/EV 400000 244 0.56 0.46 0.31 EV native interface |
906 | EV/Any 100000 610 3.52 0.91 0.75 EV + AnyEvent watchers |
906 | EV/Any 100000 610 3.52 0.91 0.75 EV + AnyEvent watchers |
907 | CoroEV/Any 100000 610 3.49 0.92 0.75 coroutines + Coro::Signal |
907 | CoroEV/Any 100000 610 3.49 0.92 0.75 coroutines + Coro::Signal |
908 | Perl/Any 16000 654 4.64 1.22 0.77 pure perl implementation |
908 | Perl/Any 16000 654 4.64 1.22 0.77 pure perl implementation |
909 | Event/Event 16000 523 28.05 21.38 0.86 Event native interface |
909 | Event/Event 16000 523 28.05 21.38 0.86 Event native interface |
910 | Event/Any 16000 943 34.43 20.48 1.39 Event + AnyEvent watchers |
910 | Event/Any 16000 943 34.43 20.48 1.39 Event + AnyEvent watchers |
911 | Glib/Any 16000 1357 96.99 12.55 55.51 quadratic behaviour |
911 | Glib/Any 16000 1357 96.99 12.55 55.51 quadratic behaviour |
912 | Tk/Any 2000 1855 27.01 66.61 14.03 SEGV with >> 2000 watchers |
912 | Tk/Any 2000 1855 27.01 66.61 14.03 SEGV with >> 2000 watchers |
913 | POE/Event 2000 6644 108.15 768.19 14.33 via POE::Loop::Event |
913 | POE/Event 2000 6644 108.15 768.19 14.33 via POE::Loop::Event |
914 | POE/Select 2000 6343 94.69 807.65 562.69 via POE::Loop::Select |
914 | POE/Select 2000 6343 94.69 807.65 562.69 via POE::Loop::Select |
915 | |
915 | |
916 | =head2 Discussion |
916 | =head2 Discussion |
917 | |
917 | |
918 | The benchmark does I<not> measure scalability of the event loop very |
918 | The benchmark does I<not> measure scalability of the event loop very |
919 | well. For example, a select-based event loop (such as the pure perl one) |
919 | well. For example, a select-based event loop (such as the pure perl one) |
… | |
… | |
948 | The C<Tk> adaptor works relatively well. The fact that it crashes with |
948 | The C<Tk> adaptor works relatively well. The fact that it crashes with |
949 | more than 2000 watchers is a big setback, however, as correctness takes |
949 | more than 2000 watchers is a big setback, however, as correctness takes |
950 | precedence over speed. Nevertheless, its performance is surprising, as the |
950 | precedence over speed. Nevertheless, its performance is surprising, as the |
951 | file descriptor is dup()ed for each watcher. This shows that the dup() |
951 | file descriptor is dup()ed for each watcher. This shows that the dup() |
952 | employed by some adaptors is not a big performance issue (it does incur a |
952 | employed by some adaptors is not a big performance issue (it does incur a |
953 | hidden memory cost inside the kernel, though). |
953 | hidden memory cost inside the kernel, though, that is not reflected in the |
|
|
954 | figures above). |
954 | |
955 | |
955 | C<POE>, regardless of underlying event loop (wether using its pure perl |
956 | C<POE>, regardless of underlying event loop (wether using its pure perl |
956 | select-based backend or the Event module) shows abysmal performance and |
957 | select-based backend or the Event module) shows abysmal performance and |
957 | memory usage: Watchers use almost 30 times as much memory as EV watchers, |
958 | memory usage: Watchers use almost 30 times as much memory as EV watchers, |
958 | and 10 times as much memory as both Event or EV via AnyEvent. Watcher |
959 | and 10 times as much memory as both Event or EV via AnyEvent. Watcher |