Oh. I would also recommend three variants, based on what people often
do, what people sometimes do, and what people probably should do when
using CGI.pm, which can make a difference (just for thoroughness):

Usually done:
#!/usr/bin/perl
use CGI;
print header;

print <<"EOF";
<html>
  <body>
    <h1>Environment dump:</h1>
    <dl>
      @{[map "<dt>$_</dt>\n<dd>$ENV{$_}</dd>\n", sort keys %ENV]}
    </dl>
  </body>
</html>
EOF

Sometimes do:
#!/usr/bin/perl
use strict;
use CGI;
my $cgi = new CGI;
print $cgi->header;

print <<"EOF";
<html>
  <body>
    <h1>Environment dump:</h1>
    <dl>
      @{[map "<dt>$_</dt>\n<dd>$ENV{$_}</dd>\n", sort keys %ENV]}
    </dl>
  </body>
</html>
EOF

Might do occassionally, and probably should do all the time if using CGI:

#!/usr/bin/perl
use strict;
use CGI(); # note the difference -- using CGI in OO mode, don't import
*anything*
my $cgi = new CGI;
print $cgi->header;

print <<"EOF";
<html>
  <body>
    <h1>Environment dump:</h1>
    <dl>
      @{[map "<dt>$_</dt>\n<dd>$ENV{$_}</dd>\n", sort keys %ENV]}
    </dl>
  </body>
</html>
EOF

2008/7/9  <[EMAIL PROTECTED]>:
> A couple of months ago i was going through slides from gozers "From CGI to
> mod_perl 2.0, Fast!" talk, which has some benchmarks comparing CGI, perlrun
> and registry to each other.  At which point i realized that i've never
> really known how much faster using straight handlers is than using one of
> the CGI emulation layers.  I also didn't have any idea how much faster
> SetHandler modperl was vs SetHandler perl-script.
>
> So i decided to see what i could figure out.  I took gozers CGI from the
> slides (slightly modified) and ran it through the paces on my laptop, then
> converted the script to run as a straight handler.
>
> here's the CGI version:
>
> #!/usr/bin/perl
>
>
> print qq[Content-Type: text/html\r\n\r\n];
>
> print(qq[
> <html><body>
> <h1>Hello Worlds</h1>
> <pre>
> GATEWAY_INTERFACE: $ENV{GATEWAY_INTERFACE}
> MOD_PERL: $ENV{MOD_PERL}
> </pre>
> </body></html>
>
> ]);
>
>
> Here's the Handler version
>
> package Kabob::HelloWorld;
>
> use strict;
> use warnings;
>
> use Apache2::RequestRec ();
>
> use Apache2::Const -compile =>qw(:common);
>
> sub handler {
>    my $r = shift;
>
>    $r->content_type('text/html');
>    $r->print(qq[
> <html><body>
> <h1>Hello Worlds</h1>
> <pre>
> GATEWAY_INTERFACE: $ENV{GATEWAY_INTERFACE}
> MOD_PERL: $ENV{MOD_PERL}
> </pre>
> </body></html>
>
>
>    ]);
>
>    return Apache2::Const::OK;
> }
>
> 1;
>
> and here's the conf (these tests were all running through a light mod_proxy
> front end too)
>
>
>    <Location /cgi/>
>        <IfDefine FrontEnd>
>            ProxyPass http://localhost:8080/cgi/
>            ProxyPassReverse http://localhost:8080/cgi/
>        </IfDefine>
>    </Location>
>    <IfDefine BackEnd>
>        ScriptAlias /cgi/ /www/p/
>    </IfDefine>
>
>
>    Alias /perlrun/ /www/p/
>    <Location /perlrun/>
>        <IfDefine FrontEnd>
>            ProxyPass http://localhost:8080/perlrun/
>            ProxyPassReverse http://localhost:8080/perlrun/
>        </IfDefine>
>        <IfDefine BackEnd>
>            SetHandler perl-script
>            PerlHandler ModPerl::PerlRun
>            Options +ExecCGI
>            PerlSendHeader On
>        </IfDefine>
>    </Location>
>
>    Alias /registry/ /www/p/
>    <Location /registry/>
>        <IfDefine FrontEnd>
>            ProxyPass http://localhost:8080/registry/
>            ProxyPassReverse http://localhost:8080/registry/
>        </IfDefine>
>        <IfDefine BackEnd>
>            SetHandler perl-script
>            PerlHandler ModPerl::Registry
>            Options +ExecCGI
>            PerlSendHeader On
>        </IfDefine>
>    </Location>
>
>
>
>    <Location /perlscript/>
>        <IfDefine FrontEnd>
>            ProxyPass http://localhost:8080/perlscript/
>            ProxyPassReverse http://localhost:8080/perlscript/
>        </IfDefine>
>        <IfDefine BackEnd>
>            SetHandler perl-script
>            PerlResponseHandler Kabob::HelloWorld
>        </IfDefine>
>    </Location>
>
>    <Location /modperl/>
>        <IfDefine FrontEnd>
>            ProxyPass http://localhost:8080/modperl/
>            ProxyPassReverse http://localhost:8080/modperl/
>        </IfDefine>
>        <IfDefine BackEnd>
>            SetHandler modperl
>            PerlResponseHandler Kabob::HelloWorld
>        </IfDefine>
>    </Location>
>
>
> and here's the results (which are no doubt flawed for a number of reasons)
>
> running: ab -n 10000 [url]
>
> CGI
> Requests per second:    217.80 [#/sec] (mean)
> Time per request:       4.591 [ms] (mean)
> Transfer rate:          53.17 [Kbytes/sec] received
>
> PerlRun
> Requests per second:    482.49 [#/sec] (mean)
> Time per request:       2.073 [ms] (mean)
> Transfer rate:          114.49 [Kbytes/sec] received
>
> Registry
> Requests per second:    693.33 [#/sec] (mean)
> Time per request:       1.442 [ms] (mean)
> Transfer rate:          164.53 [Kbytes/sec] received
>
> SetHandler perl-script
> Requests per second:    772.12 [#/sec] (mean)
> Time per request:       1.295 [ms] (mean)
> Transfer rate:          189.94 [Kbytes/sec] received
>
> SetHandler modperl
> Requests per second:    1048.66 [#/sec] (mean)
> Time per request:       0.954 [ms] (mean)
> Transfer rate:          250.84 [Kbytes/sec] received
>
> I'm not sure how well you can really compare the CGI emulation numbers to
> the PerlHandler numbers, but personally i think the 30%ish improvement from
> perl-script to modperl is pretty amazing.  I wouldn't have imagined it would
> have been that high.
>
> Adam
>
>
>
>
>
>
>
>
>



-- 
Dodger

Reply via email to