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とか色々あるよな…。色々試してみよ。