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