regexの入力長がパフォーマンスに影響を与えない理由とその可能性はありますか?regexが文字列の長さを気にしない理由
生成される文字列は次のとおりです。128個のランダムな文字。括弧の中に2つの数字があります。これは何度も繰り返されます。
128 radnom characters....(-2435346|45436) 128 radnom characters....(-32525562|-325346)
正規表現はすべての数字を括弧内に入れます。ここにパターンがあります。
\(([-+]?\d+\|[-+]?\d+)\)
だから、試合が
-2435346|45436
-32525562|-325346
etc...
のようになる。ここベンチマークを行うコードです。私はマッチングの時間だけを評価したいので、入力が生成された後にストップウォッチを開始します。
Random rand = new Random();
Func<string> getRandString = // generates 128 random characters.
() => Enumerable.Range(0, 128).Select(x => (char) rand.Next()).Aggregate("", (a, b) => a + b);
Func<int> getRandInteger =() => rand.Next(); // generates random number.
string format = "{0}({1}|{2})";
// Generate the big string.
StringBuilder bigstr = new StringBuilder();
for (int i = 0; i < 100; i++) // repeat 100 times.
{
bigstr.Append(string.Format(format, getRandString(), getRandInteger(), getRandInteger()));
}
string input = bigstr.ToString();
Stopwatch stopwatch = Stopwatch.StartNew();
var matches = Regex.Matches(input, @"\(([-+]?\d+\|[-+]?\d+)\)");
stopwatch.Stop();
Console.WriteLine("Time Elapsed :\t{0}\nInputLength :\t{1}\nMatches Count :\t{2}", stopwatch.Elapsed, input.Length, matches.Count);
私はループに10
回繰り返す場合、これは私のコンソールで出力されます。
Time Elapsed : 00:00:00.0004132
InputLength : 1500
Matches Count : 10
ループ1000
回繰り返す場合。
Time Elapsed : 00:00:00.0004373 // seriously?
InputLength : 149937
Matches Count : 1000
ループ1000000
を繰り返すとします。
Time Elapsed : 00:00:00.0004900 // wtf?
InputLength : 149964452
Matches Count : 1000000
スクリーンショットあなたが
を信じていけない場合、これは遅延評価のいくつかの種類ですか?もしそうなら、どのように試合の数を表示することができますか?どのように私はデバッガでこれをやったと私は一致を見ることができます。
私の正規表現のパターンには特別なものがあります。文字列の長さがパフォーマンスにどのように影響しないか?理解できません。
ここには何も特別なものはありません。あなたの正規表現エンジンは文字列をトラバースし、あなたの正規表現にマッチするすべての状態を保存します。そして、あなたは1000時間の大きな文字列のベンチマークです。もっと大きな文字列。あるいはあなたのベンチマリコンは公平でないかもしれません。 – Kasramvd
.NET regexエンジンで使用される文字列検索アルゴリズムの詳細については、[this answer of mine](http://stackoverflow.com/a/32618592/3764814)を参照してください。 –
適切なベンチマーク:https://andreyakinshin.gitbooks.io/performancebookdotnet/content/science/microbenchmarking.html –