POE::Component::Server::TCPとIO::Lambda::Socket::TCPServerのちょっとしたベンチ

 ベンチというにはちょっとアレな内容及びやり方ですが、
 http://search.cpan.org/src/KARASIK/IO-Lambda-1.02/eg/bench/
 ここのベンチスクリプトを基に、自分で多少改良を加えてテストしてみました。
 POEのテストの時にPOCo::Client::TCP使って、IO::Lambdaの時にIO::Lambdaのほぼ生ソケット使うのはあまりにフェアじゃないだろ。

#!/usr/bin/env perl
# poe-server.pl
use strict;
use warnings;
use POE qw(Component::Server::TCP Component::Client::TCP Filter::Stream);

POE::Component::Server::TCP->new(
    Port => 10000,
    ClientInput => sub {
        my ( $heap, $input ) = @_[ HEAP, ARG0 ];
        $heap->{client}->put( $input )
    },
);
$poe_kernel->run();
#!/usr/bin/env perl
# lambda-server.pl

use strict;
use warnings;
use IO::Lambda qw(:all);
use IO::Lambda::Socket::TCPServer qw(:all);

my $server = lambda {
    context { LocalPort => 10000 };
    server_start {
        context shift;
    client_accepted {
        my ( $client, $input ) = @_;
        $client->put( $input );
    }};
};
$server->wait;
#!/usr/bin/env perl
# socket-client.pl

use strict;
use warnings;
use Time::HiRes qw(time);

use IO::Socket;
use IO::Lambda qw/:all/;

my $CYCLES = 500;

sub sock
{
	my $x = IO::Socket::INET-> new(
		PeerAddr  => 'localhost',
		PeerPort  => 10000,
		Proto     => 'tcp',
	);
	$x-> autoflush(1);
	die "connect() error: $!\n" unless $x;
	return $x;
}

my $t = time;
for my $id ( 1..$CYCLES) {
	this lambda {
		my $sock = sock;
		context $sock;
		writable {
			print $sock "can write $id\n";
		readable {
			close $sock;
		}};
	};
	this-> wait;
}
$t = time - $t;
printf "%.3f sec\n", $t;

# poe-server.pl実行時
$ perl socket-client.pl
1.082 sec
# lambda-server.pl実行時
$ perl socket-client.pl
0.962 sec

 ということだそうです。何回か実行してみたけど、あんまり差がでないな…。できたらちゃんと、Benchmarkモジュールか何かで書き直せないかなぁ…。
(追記)
 $CYCLESを50000にしたら、9秒近く差がでた(lambda:89.809sec、poe:98.867sec)。やっぱ、決定的かな。
(さらに追記)
 そういえば、Test::TCPとか色々あるよな…。色々試してみよ。