The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

use strict;
use warnings;
use HTTP::Request::Common;
use HTTP::Message::PSGI;
use Plack::Test;
use Plack::Builder;
use Apache::LogFormat::Compiler;
use Benchmark qw/cmpthese timethese/;

my $log_app = builder {
    enable 'AccessLog', format => "combined";
    sub{ [ 200, [], [ "Hello "] ] };
};

my $log_handler = Apache::LogFormat::Compiler->new();
my $compile_log_app = builder {
    enable sub {
        my $app = shift;
        sub {
            my $env = shift;
            my $res = $app->();
            warn $log_handler->log_line($env,$res,6,0);
        }
    };
    sub{ [ 200, [], [ "Hello "] ] };
};

my $env = req_to_psgi(GET "/");
open(STDERR,'>','/dev/null');

cmpthese(timethese(0,{
    'log'   => sub {
        $log_app->($env);
    },
    'compilelog'   => sub {
        $compile_log_app->($env);
    },
}));

__END__
Benchmark: running compilelog, log for at least 3 CPU seconds...
compilelog:  3 wallclock secs ( 3.03 usr +  0.19 sys =  3.22 CPU) @ 25447.20/s (n=81940)
       log:  3 wallclock secs ( 3.17 usr +  0.01 sys =  3.18 CPU) @ 3226.73/s (n=10261)
              Rate        log compilelog
log         3227/s         --       -87%
compilelog 25447/s       689%         --