Skip to content

Instantly share code, notes, and snippets.

@bayashi
Created March 1, 2015 00:28
Show Gist options
  • Save bayashi/ffc7edd26f609af54c46 to your computer and use it in GitHub Desktop.
Save bayashi/ffc7edd26f609af54c46 to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use Benchmark qw(cmpthese);
my $h = '25';
my $pattern = '((?:(?:'.$h.'[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))';
my $regexp = qr/$pattern/;
my $regexp_o = qr/$pattern/o;
my $ipv4 = '192.168.1.1';
cmpthese(0, +{
'precompile' => sub {
$ipv4 =~ $regexp;
},
'precompile_o' => sub {
$ipv4 =~ $regexp_o;
},
'runtime' => sub {
$ipv4 =~ /$pattern/;
},
'runtime_optimized' => sub {
$ipv4 =~ /$pattern/o;
},
'runtime_static' => sub {
$ipv4 =~ /((?:(?:$h[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))/;
},
'runtime_static_o' => sub {
$ipv4 =~ /((?:(?:$h[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))/o;
},
});
@bayashi
Copy link
Author

bayashi commented Mar 1, 2015

こうなった

                      Rate runtime_static runtime_static_o runtime precompile precompile_o runtime_optimized
runtime_static    412360/s             --              -5%    -19%       -20%         -22%              -25%
runtime_static_o  434213/s             5%               --    -14%       -15%         -17%              -21%
runtime           507522/s            23%              17%      --        -1%          -4%               -7%
precompile        513420/s            25%              18%      1%         --          -2%               -6%
precompile_o      526319/s            28%              21%      4%         3%           --               -4%
runtime_optimized 546681/s            33%              26%      8%         6%           4%                --
  • oよりprecompile の方が効果が大きく、precompileに o つけるの関係なさそう。
  • runtime につけて効果のでるのが o っぽい。
  • precompile より、正規表現全体変数に入ってるものが runtime に o される方が速い。

ということかな

@bayashi
Copy link
Author

bayashi commented Mar 1, 2015

precompileに o つけるの関係なさそう、というのは、実行なんどかやってみると、そこそこの確度で o 付の方が遅くなったりもするから。

@gfx
Copy link

gfx commented Mar 1, 2015

@gfx
Copy link

gfx commented Mar 1, 2015

最近のPerlは /o 関係ないはず。perldoc perlreにも書いてませんし、obsoleteな仕様です(実装自体はたぶんまだ残ってるものの)。

@gfx
Copy link

gfx commented Mar 1, 2015

precompileがいまいち速くないのは謎で、よくわかりませんね…。

@gfx
Copy link

gfx commented Mar 1, 2015

Perlのバージョンによっても違うと思うのでバージョン併記してくだしあ。

@i110
Copy link

i110 commented Mar 1, 2015

@i110
Copy link

i110 commented Mar 1, 2015

このbayashiさんのやつ、runtime_staticでも変数$hがあるので本当の意味で静的じゃない気がしますね。
チュートリアルかどっかで、静的な奴は自動的に1回だけコンパイルしてくれるようになってる的なことを読んだ気がするので、その意味では公平な比較でないような気もします。
(そこまでやってくれるなら$hのインライン化もやっといてくれよって感じですが)

@bayashi
Copy link
Author

bayashi commented Mar 1, 2015

ぼくのは Perl5.8.9 すね!

最初のコードで precompile の話と /o の話が混ざってるのを分離した方がよさそうかな。
もとから混ざってたから全条件並べただけだけどね!

https://gist.github.com/i110/901b94e7a86911c31930
この比較コードが precompile のベンチとしては良さそう。

@bayashi
Copy link
Author

bayashi commented Mar 1, 2015

正規表現周りのパフォチューだと

  • マッチ試行回数自体を減らす
    • 複数の正規表現まとめて一撃化したりとか
  • マッチ対象文字列を小さくできたらする
  • 正規表現で再帰的なことしてるとかは直せるなら直そう

みたいな感じで、precompile(できれば) とか /o(付けられれば) とかは
なんかもう最後の一押し的な感じですかねえ
文字列の存在見るだけなら正規表現じゃなくて index でやろうとかもあるか

@i110
Copy link

i110 commented Mar 1, 2015

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment