前のエントリで紹介した HTTP::Entity::Parser ですが、プロファイリングとるとPOSTデータの解析で半分弱の時間を使っていたのでそこをXSにしたら良いんじゃないかということで、新しく WWW::Form::UrlEncoded ってのを書いて出しました。
https://metacpan.org/release/WWW-Form-UrlEncoded
https://github.com/kazeburo/WWW-Form-UrlEncoded
似たモジュールに URL::Encode や Text::QueryString がありますが、HTTP::Bodyのパーサと互換性あるこの仕様を満たしていないので、新しく書き起こしてみました。URL::Encode(::XS) がかなり速いのですが、それに近い速度がでています。
Rate wwwform_pp text_qs wwwform urlencode
wwwform_pp 11933/s -- -77% -87% -88%
text_qs 52609/s 341% -- -43% -46%
wwwform 91995/s 671% 75% -- -5%
urlencode 97303/s 715% 85% 6% --
そして、これをHTTP::Entitiy::Parserに組み込んで0.03としてリリースしました
https://metacpan.org/release/HTTP-Entity-Parser
https://github.com/kazeburo/HTTP-Entity-Parser/
ベンチマークはPOSTデータのサイズを変えながら3つとってみました
## content length => 38
Benchmark: running http_body, http_entity for at least 1 CPU seconds...
http_body: 1 wallclock secs ( 1.08 usr + 0.00 sys = 1.08 CPU) @ 36201.85/s (n=39098)
http_entity: 1 wallclock secs ( 1.12 usr + 0.00 sys = 1.12 CPU) @ 76799.11/s (n=86015)
Rate http_body http_entity
http_body 36202/s -- -53%
http_entity 76799/s 112% --
## content length => 177
Benchmark: running http_body, http_entity for at least 1 CPU seconds...
http_body: 1 wallclock secs ( 1.11 usr + 0.00 sys = 1.11 CPU) @ 14901.80/s (n=16541)
http_entity: 1 wallclock secs ( 1.08 usr + 0.00 sys = 1.08 CPU) @ 64474.07/s (n=69632)
Rate http_body http_entity
http_body 14902/s -- -77%
http_entity 64474/s 333% --
## content length => 1997
Benchmark: running http_body, http_entity for at least 1 CPU seconds...
http_body: 1 wallclock secs ( 1.16 usr + 0.00 sys = 1.16 CPU) @ 1930.17/s (n=2239)
http_entity: 1 wallclock secs ( 1.11 usr + 0.00 sys = 1.11 CPU) @ 29519.82/s (n=32767)
Rate http_body http_entity
http_body 1930/s -- -93%
http_entity 29520/s 1429% --
データが大きくなればなるほど差が大きくなります。