HTTP::Parser::XS - a PSGI compatible, fast http parser

んー、と思って、書いた。GitHub - kazuho/p5-http-parser-xs: a fast http parser

BLURB は、

  • PSGI のリクエストオブジェクトを返す
  • 高速
  • 同期 httpd, 非同期 httpd のどちらを実装する際にも使用可能
  • POST コンテンツのハンドリングはご自分で
    • いったんファイルに入れたり、いろいろ要件があるし、パース作業は発生しないので Perl でもあまり遅くならないため

てな感じです。以下ベンチマーク。

$ ./http-parser-vs-xs-benchmark.pl 
                    Rate     HTTP::Parser HTTP::Parser::XS
HTTP::Parser      2978/s               --             -95%
HTTP::Parser::XS 54348/s            1725%               --

ベンチマークに使ったコードは、以下のとおり。

#! /usr/bin/perl

use strict;
use warnings;

use Benchmark qw(cmpthese);
use HTTP::Parser;
use HTTP::Parser::XS qw(parse_http_request);

my $req = "GET / HTTP/1.0\r\n\r\n";
my $http_parser = HTTP::Parser->new();
my %xs_env;

cmpthese(100000, {
    'HTTP::Parser' => sub {
        my $status = $http_parser->add($req);
        if ($status == 0) {
            $http_parser->request();
        } else {
            die "oh!\n";
        }
    },
    'HTTP::Parser::XS' => sub {
        my $len = parse_http_request($req, \%xs_env);
        if ($len >= 0) {
            # ok
        } else {
            die "agh!\n";
        }
    },
});