正規表現でのメールアドレスチェックは見直すべき – ReDoS – yohgaki's blogを見て,Perl 5だとどうなるんだらうと書いてみた。ちなみに,perl 5.18.2とruby 2.0.0p648。
use strict; use warnings; use feature qw/ say /; use Time::HiRes qw/ time /; for my $n (5 .. 12) { my $s = "username\@host" . ".abcde" x $n . "."; my $start = time(); say $s; say $s=~ /\A([\w+\-].?)+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/ms; say(length($s) . ': ' . (time - $start)); }
結果としては,
time perl test.pl 44: 0.000130891799926758 50: 0.0001068115234375 56: 0.000277042388916016 62: 0.000208139419555664 68: 0.000213861465454102 74: 0.000242948532104492 80: 0.00024104118347168 86: 0.000189065933227539 real 0m0.028s user 0m0.017s sys 0m0.008s
time ruby test.rb nil "44: 0.068262" nil "50: 0.385222" nil "56: 1.905355" nil "62: 9.483776" nil "68: 46.55787" nil "74: 230.308585" nil "80: 1156.772055" real 24m5.527s user 23m57.498s sys 0m2.997s
といったところ。既知の結果ではありとくに云ふべきことないけれど,試してみるとほんとにぜんぜん違ふのは驚いた。