#!/usr/bin/perl use strict; use vars qw($NUM_OF_EVENTS $USE_EVENT $USE_IO_POLL); use Time::HiRes qw(gettimeofday tv_interval); sub die_usage { my $usage = "\n"; if(my $msg = shift) { $usage .= "ERROR: $msg\n\n"; } $usage .= < < --use-event > < --use-io-poll > Options: --help : this help text --events=NUM : the number of events to run. defaults to 10000 --use-event : use Event.pm's internal event loop --use-io-poll : use IO::Poll.pm's internal event loop if --use-event or --use-io-poll are not chosen, POE's native event loop will be used. EOU my_die($usage); } sub my_die ($) { print STDERR $_[0]."\n"; exit 1; } sub late_use ($) { my $module = shift; eval "use $module;"; my_die($@) if ($@); } BEGIN { use Getopt::Long; $USE_EVENT = 0; $USE_IO_POLL = 0; my $help = 0; $NUM_OF_EVENTS = 10000; GetOptions( 'events=i' => \$NUM_OF_EVENTS, 'use-event+' => \$USE_EVENT, 'use-io-poll+' => \$USE_IO_POLL, 'help+' => \$help, ); die_usage() if $help; 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); if($USE_EVENT) { late_use('Event'); } elsif ($USE_IO_POLL) { late_use('IO::Poll'); } late_use('POE'); } my($tr_start, $tr_stop); POE::Session->create( inline_states => { _start => sub { $tr_start = [gettimeofday]; $_[KERNEL]->yield('iterate', 0) }, _stop => sub { $tr_stop = [gettimeofday] }, iterate => sub { $_[KERNEL]->yield('iterate', ++$_[ARG0]) unless $_[ARG0] > $NUM_OF_EVENTS; } } ); $POE::Kernel::poe_kernel->run(); my $elapsed = tv_interval($tr_start, $tr_stop); my $event_avg = int($NUM_OF_EVENTS/$elapsed); print "Events per second: $event_avg\n";