Last active
August 29, 2015 14:16
-
-
Save i110/28abb5692ee1ed2bbb0a to your computer and use it in GitHub Desktop.
結論
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl | |
use strict; | |
use warnings; | |
use utf8; | |
use feature 'say'; | |
use Benchmark qw(cmpthese); | |
say $]; | |
my $pattern = '((?:(?:25[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 $ipv4 = '192.168.1.1'; | |
cmpthese(0, +{ | |
'reref_expand_pattern' => sub { | |
$ipv4 =~ qr/$pattern/; | |
}, | |
'reref_static' => sub { | |
$ipv4 =~ qr/((?:(?:25[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]?))/; | |
}, | |
'expand_reref' => sub { | |
$ipv4 =~ /$regexp/; | |
}, | |
'precompile' => sub { | |
$ipv4 =~ $regexp; | |
}, | |
'expand_pattern' => sub { | |
$ipv4 =~ /$pattern/; | |
}, | |
'static' => sub { | |
$ipv4 =~ /((?:(?:25[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]?))/; | |
}, | |
}); |
結論
- 正規表現のリファレンス生成(qr)&デリファレンスが遅い
- すげえ遅い
- 内部で何が起こっているかはわからないが、他に比べて正規表現は特に遅いように思われる
- プリコンパイルはしないほうが良い
- 当然プリコンパイル自体が悪いわけではない
- が、プリコンパイルしてから再利用しようとするとリファレンス化せざるを得ない(よね?)
- コンパイル回数を減らす効果よりもデリファレンスのoverheadのほうが大きいので結局意味無い
- ただしものっっそい複雑でコンパイルのコストが高い正規表現とかの場合は話が変わるかもしれない
- その他の最適化めいたものは基本的に変化なし
- 変数展開とかも微々たるもの
- oオプションも確かにobsoletedのようである
(´・ω・`).;:…(´・ω...:.;::..(´・;::: .:.;: サラサラ..
ふと思い立って色んな長さのパターンで試してみた
5倍の長さ(上記パターンの5回繰り返し)
Rate reref_expand_pattern reref_static expand_reref precompile expand_pattern static
reref_expand_pattern 1031053/s -- -5% -69% -72% -92% -97%
reref_static 1082539/s 5% -- -68% -71% -92% -97%
expand_reref 3352499/s 225% 210% -- -10% -74% -91%
precompile 3729822/s 262% 245% 11% -- -71% -90%
expand_pattern 12923405/s 1153% 1094% 285% 246% -- -65%
static 37147799/s 3503% 3332% 1008% 896% 187% --
ipv4の最初の数字のみ /(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/
Rate reref_expand_pattern reref_static precompile expand_reref expand_pattern static
reref_expand_pattern 809465/s -- -9% -49% -50% -74% -76%
reref_static 891487/s 10% -- -44% -45% -71% -74%
precompile 1582768/s 96% 78% -- -2% -48% -54%
expand_reref 1613850/s 99% 81% 2% -- -47% -53%
expand_pattern 3055255/s 277% 243% 93% 89% -- -11%
static 3440637/s 325% 286% 117% 113% 13% --
1文字のみ /1/
Rate reref_expand_pattern reref_static precompile expand_reref expand_pattern static
reref_expand_pattern 1037153/s -- -6% -63% -64% -90% -92%
reref_static 1099748/s 6% -- -61% -62% -89% -92%
precompile 2802480/s 170% 155% -- -2% -72% -79%
expand_reref 2861048/s 176% 160% 2% -- -72% -79%
expand_pattern 10190294/s 883% 827% 264% 256% -- -25%
static 13508011/s 1202% 1128% 382% 372% 33% --
全方位的にベタ書き最強でしたとさ。
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
5.16.3の出来事