1#!/usr/bin/perl
2
3use strict;
4use vars qw($NUM_OF_EVENTS $USE_EVENT $USE_IO_POLL);
5
6use Time::HiRes qw(gettimeofday tv_interval);
7
8sub die_usage {
9    my $usage = "\n";
10    if(my $msg = shift) {
11        $usage .= "ERROR: $msg\n\n";
12    }
13    $usage .= <<EOU;
14Usage: $0 < --events=NUM > < --use-event > < --use-io-poll >
15Options:
16    --help         :  this help text
17    --events=NUM   :  the number of events to run. defaults to 10000
18    --use-event    :  use Event.pm's internal event loop
19    --use-io-poll  :  use IO::Poll.pm's internal event loop
20
21    if --use-event or --use-io-poll are not chosen, POE's native event loop
22    will be used.
23EOU
24    my_die($usage);
25}
26
27sub my_die ($) {
28    print STDERR $_[0]."\n";
29    exit 1;
30}
31
32sub late_use ($) {
33    my $module = shift;
34    eval "use $module;";
35    my_die($@) if ($@);
36}
37
38BEGIN {
39    use Getopt::Long;
40    $USE_EVENT = 0;
41    $USE_IO_POLL = 0;
42    my $help = 0;
43
44    $NUM_OF_EVENTS = 10000;
45
46    GetOptions( 'events=i' => \$NUM_OF_EVENTS,
47                'use-event+' => \$USE_EVENT,
48                'use-io-poll+' => \$USE_IO_POLL,
49                'help+' => \$help,
50                );
51    die_usage() if $help;
52    die_usage('Both use-event and use-io-poll are selected. Only one loop type may be chosen.') if($USE_EVENT + $USE_IO_POLL > 1);
53
54    if($USE_EVENT) {
55        late_use('Event');
56    } elsif ($USE_IO_POLL) {
57        late_use('IO::Poll');
58    }
59
60    late_use('POE');
61}
62
63
64my($tr_start, $tr_stop);
65POE::Session->create(
66    inline_states => {
67        _start => sub { $tr_start = [gettimeofday]; $_[KERNEL]->yield('iterate', 0) },
68        _stop => sub { $tr_stop = [gettimeofday] },
69
70        iterate => sub { $_[KERNEL]->yield('iterate', ++$_[ARG0]) unless $_[ARG0] > $NUM_OF_EVENTS; }
71    }
72);
73
74$POE::Kernel::poe_kernel->run();
75
76my $elapsed = tv_interval($tr_start, $tr_stop);
77my $event_avg = int($NUM_OF_EVENTS/$elapsed);
78print "Events per second: $event_avg\n";
79
80