Stas Bekman <[EMAIL PROTECTED]> writes: > Well, I've run the benchmark and it wasn't the case. Did it change > recently? Or do you think that the benchmark is not fair? > > we are talking about this item > http://perl.apache.org/guide/performance.html#Apache_args_vs_Apache_Request
Right- param() was rewritten as XS about 6-8 months ago; since then I've benchmarked it a few times and found param() to be a bit faster than args(). We'll be releasing a 1.0 version of libapreq as soon as Jim approves of the current CVS version. Here's what I got using it on your benchmark (some differences: the tests were run against localhost running perl 5.00503 + mod_perl 1.26 + apache 1.3.22 and using Perl handlers instead of Apache::RegistryLoader scripts): Stas's strings: my $query = [ join("&", map {"$_=".'e' x 10} ('a'..'b')), join("&", map {"$_=".'e' x 10} ('a'..'z')), ]; Joe's strings: %Q = qw/ one alpha two beta three gamma four delta /; my $query = [ join("&", map "$_=$Q{$_}", keys %Q), join("&", map "$_=".escape($_), %Q), ]; Stas's Query Joe's Query short long short long table 124 91 119 112 args 125 93 116 110 do 124 103 121 118 param 132 106 128 123 noparse 138 136 133 131 REQUESTS PER SECOND Here I used ab with concurrency = 1 to avoid "complications", but that shouldn't make a difference if we're talking subroutine performance. The real disappointment here is handler_table, which would be the fastest if perl's tied hash implementation didn't suck so badly. IMO perl's performance for tied-variable access is shameful, but apparently the problem is unfixable in perl5. HANDLERS: sub handler_args { my $r = shift; my %args = $r->args; $r->send_http_header('text/plain'); print join "\n", %args; } sub handler_table { my $r = Apache::Request->new(shift); my %args = %{ $r->param }; $r->send_http_header('text/plain'); print join "\n", %$args; } sub handler_do { my $r = Apache::Request->new(shift); my args; $r->param->do( sub {$args{$_[0]}=$_[1];1} ); $r->send_http_header('text/plain'); print join "\n", %$args; } sub handler_param { my $r = Apache::Request->new(shift); my %args = map +( $_ => $r->param($_) ), $r->param; $r->send_http_header('text/plain'); print join "\n", %args; } sub handler_noparse { my $r = shift; $r->send_http_header('text/plain'); print "OK"; } -- Joe Schaefer