The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# $Id: tcp-poe-components.pl,v 1.1 2009/01/17 11:26:53 dk Exp $
# An POE::Component::{Server,Client}::TCP based echo client/server benchmark.

use warnings;
use strict;

use Time::HiRes qw(time);
use POE qw(Component::Server::TCP Component::Client::TCP);
use IO::Socket::INET;

my $CYCLES = 500;
my $port   = 11211;

# Echo server.  Created before starting the timer, because other
# benchmarks also do this.

POE::Component::Server::TCP->new(
	Address => '127.0.0.1',
	Port => $port,
	ClientInput => sub { $_[HEAP]{client}->put($_[ARG0]); },
);

my $t = time;

# Client.  Client creation is part of the benchmark.

{
	my $connections = 0;

	POE::Component::Client::TCP->new(
		RemoteAddress => '127.0.0.1',
		RemotePort => $port,
		Connected => sub {
			$connections++;
			$_[HEAP]{server}->put("can write $connections");
		},
		ServerInput => sub {
			if ($connections >= $CYCLES) {
				$_[KERNEL]->stop();
			}
			else {
				$_[KERNEL]->yield("reconnect");
			}
		},
	)
}

POE::Kernel->run();

$t = time - $t;
printf "%.3f sec\n", $t;
exit;