Perl日記

PerlとかRubyとかPHPとかPythonとか

Perlのバージョン毎のqr//速度

久しぶりにモダパー読み直してたらqr//と文字列の正規表現マッチ速度が出てたので、新しい5.16とかも出てきてるし、やってみた。

use strict;
use Benchmark qw/ cmpthese /;

my $re_string = 'a.c';
my $re_regexp = qr/a.c/;

sub match {
  my $re = shift;
  "abc" =~ /$re/;
}

cmpthese(1_000_000, {
  string => sub { match($re_string) },
  regexp => sub { match($re_regexp) },
});
$ perlbrew exec perl qr_speed.pl

perl-5.8.9
==========
            Rate regexp string
regexp 2173913/s     --    -0%
string 2173913/s     0%     --


perl-5.10.1
==========
            Rate regexp string
regexp 1086957/s     --   -45%
string 1960784/s    80%     --


perl-5.12.4
==========
            Rate regexp string
regexp 1176471/s     --   -38%
string 1886792/s    60%     --


perl-5.14.2
==========
            Rate regexp string
regexp 1136364/s     --   -51%
string 2325581/s   105%     --


perl-5.16.0
==========
            Rate regexp string
regexp 1063830/s     --   -50%
string 2127660/s   100%     --


perl-5.17.0
==========
            Rate regexp string
regexp 1030928/s     --   -44%
string 1851852/s    80%     --


5.8.9以外、stringの方がかなり速い。
Macのdarwinでは

qr//オペレーターに対してまだチューニングが充分されていないということが読み取れます。
(P248)

ということでいいのだろうか?




モダンPerl入門 (CodeZine BOOKS)

モダンPerl入門 (CodeZine BOOKS)


2012/6/4追記

CentOS5(32bit)でやってみた。

$ perlbrew exec perl qr_speed.pl
perl-5.8.8
==========
           Rate string regexp
string 628931/s     --    -5%
regexp 662252/s     5%     --


perl-5.8.9
==========
           Rate string regexp
string 704225/s     --   -12%
regexp 800000/s    14%     --


perl-5.10.1
==========
           Rate regexp string
regexp 543478/s     --   -19%
string 671141/s    23%     --


perl-5.12.4
==========
           Rate regexp string
regexp 546448/s     --   -20%
string 684932/s    25%     --


perl-5.14.2
==========
           Rate regexp string
regexp 546448/s     --   -25%
string 724638/s    33%     --


perl-5.16.0
==========
           Rate regexp string
regexp 502513/s     --   -26%
string 680272/s    35%     --


perl-5.17.0
==========
           Rate regexp string
regexp 490196/s     --   -29%
string 694444/s    42%     --

Macよりはstringとregexpの差が小さい。5.8.xだけregexpが上回る、というのは変わらないみたいだけれど。