パフォーマンスに関してのみ、文字列操作に対して正規表現を使用する必要があるのはいつですか?
4 に答える
場合によります
通常、文字列操作は多少高速になりますが、実際のパフォーマンスは次のような多くの要因に大きく依存します。
- 正規表現を解析する回数
- 文字列コードの書き方の巧妙さ
- 正規表現がプリコンパイルされているかどうか
正規表現がより複雑になるにつれて、適切に機能する同等の文字列操作コードを記述するには、より多くの労力と複雑さが必要になります。
文字列操作は、正規表現操作よりも常に高速です。もちろん、非効率的な方法で文字列操作を記述しない限り。
正規表現を解析し、文字列操作を使用して操作を実行するコードを生成する必要があります。せいぜい、正規表現操作は、文字列操作を行うのに最適なことを行うことができます。
正規表現は、単純な文字列操作よりも高速に実行できるため使用されません。ごくわずかなコードで非常に複雑な操作をかなり小さなオーバーヘッドで実行できるため、正規表現が使用されます。
FunctionOne (文字列操作) と FunctionTwo (正規表現) という 2 つの関数を使用して、いくつかのベンチマークを行いました。どちらも「<」と「>」の間のすべての一致を取得する必要があります。
ベンチマーク #1:
- 呼び出し回数: 1'000'000
- 入力:80文字
- 期間 (文字列操作 // FunctionOne): 1.12 秒
- 期間 (正規表現操作 //FunctionTwo): 1.88 秒
ベンチマーク #2:
- 呼び出し回数: 1'000'000
- 入力: 2000 文字
- 持続時間 (文字列操作): 27.69 秒
- 期間 (正規表現操作): 41.436 秒
結論: 文字列操作は、効率的にプログラムされていれば、ほぼ常に正規表現よりも優れています。しかし、複雑になればなるほど、パフォーマンスの問題だけでなく、メンテナンスに関しても文字列操作を維持することが難しくなります。
コード FunctionOne
private void FunctionOne(string input) {
var matches = new List<string>();
var match = new StringBuilder();
Boolean startRecording = false;
foreach( char c in input) {
if (c.Equals('<')) {
startRecording = true;
continue;
}
if (c.Equals('>')) {
matches.Add(match.ToString());
match = new StringBuilder();
startRecording = false;
}
if (startRecording) {
match.Append(c);
}
}
}
コード機能 2
Regex regx = new Regex("<.*?>");
private void FunctionTwo(string input) {
Match m = regx.Match(input);
var results = new List<string>();
while (m.Success) {
results.Add(m.Value);
m = m.NextMatch();
}
}