大きなテキストファイルの解析中に正規表現のパフォーマンスの問題が発生します。私は次のコードで.NET 4.0を使用しています
:.NETの正規表現パフォーマンスとJavaの比較
private static pattern =
@"((\D|^)(19|20|)\d\d([- /.\\])(0[1-9]|1[012]|[1-9])\4(0[1-9]|[12][0-9]|3[01]|[0-9]) (\D|$))|" +
@"((\D|^)(19|20|)\d\d([- /.\\])(0[1-9]|[12][0-9]|3[01]|[0-9])\11(0[1-9]|1[012]|[0-9]) (\D|$))|" +
@"((\D|^)(0[1-9]|1[012]|[0-9])([- /.\\])(0[1-9]|[12][0-9]|3[01]|[0-9])\18(19|20|)\d\d(\D|$))|" +
@"((\D|^)(0[1-9]|[12][0-9]|3[01]|[0-9])([- /.\\])(0[1-9]|1[012]|[0-9])\25(19|20|)\d\d(\D|$))|" +
@"((\D|^)(19|20|)\d\d(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])(\D|$))|" +
@"((\D|^)(19|20|)\d\d(0[1-9]|[12][0-9]|3[01])(0[1-9]|1[012])(\D|$))|" +
@"((\D|^)(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])(19|20|)\d\d(\D|$))|" +
@"((\D|^)(0[1-9]|[12][0-9]|3[01])(0[1-9]|1[012])(19|20|)\d\d(\D|$))|" +
@"((^|(?<!(\d[- /.\\\d])|\d))(19|20|)\d\d([- /.\\])(0[1-9]|1[012]|[1-9])([^- /.\\\d\w]|$|\s))|" +
@"((^|(?<!(\d[- /.\\\d])|\d))(0[1-9]|1[012]|[1-9])([- /.\\])(19|20|)\d\d([^- /.\\\d\w]|$|\s))|" +
@"((^|(?<!(\d[- /.\\\d])|\d))(0[1-9]|1[012]|[1-9])([- /.\\])(0[1-9]|[12][0-9]|3[01])([^- /.\\\d\w]|$|\s))|" +
@"((^|(?<!(\d[- /.\\\d])|\d))(0[1-9]|[12][0-9]|3[01])([- /.\\])(0[1-9]|1[012]|[1-9])([^- /.\\\d\w]|$|\s))";
private static Regex dateRegex = new new Regex(pattern,
RegexOptions.Compiled | RegexOptions.IgnoreCase |
RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline);
public static void Extract(string text)
{
foreach (Match match in dateRegex.Matches(text))
Console.Writeline("Match {0}",match.Value);
}
200試合を含み1MBのテキストファイルの処理時間が〜22secsです。
Javaで同じ正規表現を実行すると、〜13秒という非常に高速な結果が得られます。
正規表現をパーツに分割して実行を並列化することで、.NETコードの処理時間を短縮することができました。
なぜJavaがこの正規表現を処理する方が速いのですか?
この正規表現を処理する.NETのパフォーマンスを改善するにはどうすればよいですか?
乾杯、
ドロン
これはおそらく違いの多くを作るが、あなたは、単にコンソールに書き込まずに '' dateRegex.Matched(テキスト)を実行しようとしていないのですか? – snurre
正確にパターンマッチングは何ですか?可能であれば、DFAベースのパーサまたは文脈のない言語のサブセット用のパーサを考慮する必要があります。 Ex fslex(とfsyacc) –
文字列を反復処理して数字が出現するたびに正規表現を次の10文字に適用するのは意味がありますか? –