2

私は現在、.NET 4.0 で最初のプロジェクトに取り組んでおり、数千の文字列比較が必要です (特定のファイルのディレクトリと、場合によってはドライブ全体を検索しています)。ほとんどの場合、ファイル パスのみを調べているため、文字列は非常に短いので、String.Contains() を使用して、ファイル パス文字列に針文字列が含まれているかどうかを確認しました。

私は疑問に思っていましたが、Regexの方が良い考えでしょうか? 正規表現が標準の文字列比較よりも高速になるのはどの時点ですか? 比較する文字列の長さまたは比較する文字列の数に基づいていますか?

4

4 に答える 4

2

可変です。比較パフォーマンスは、入力データ、比較に使用されるカルチャ、大文字と小文字の区別、CompareOptions. Regex オブジェクトは (Regexキャッシュ内にない限り) インスタンス化するのにコストがかかるため、1 回限りの比較を頻繁に行う場合は、使用するのにあまり適してIndexOf()いません。通常、YMMV.

Contains/IndexOf を使用する場合、ユーザー/スレッドが実行されているカルチャによって比較方法が決定されることに注意してください。これは、パフォーマンスに大きな影響を与える可能性があります。すべての文化が同じように速いわけではありません。

インバリアント カルチャーは非常に速いカルチャーです。CompareInfoを実行するのではなく、 を直接使用するString.IndexOf()と、さらにいくらか速くなります。

CultureInfo.InvariantCulture.CompareInfo.IndexOf(..)

正しい選択をする自信を持つ唯一の方法は、ベンチマークを行うことです。とはいえ、何メガバイトもの文字列を移動しない限り、誰にとっても重要な違いはありません。ChrisF が以前に言ったように、その場合は読み取り可能/保守可能なコードに焦点を当てます。

正規表現を最大限に活用するための優れた記事: 正規表現のパフォーマンスの最適化

于 2010-07-01T17:44:38.383 に答える
2

検索式が単純な場合は、正規表現に移行する価値はないと思います。コーディングと読み取りがどれほど上手でも、コードを理解するのに時間がかかります。 ) 6 か月後にもう一度見てください。

速度の向上がごくわずかである場合は、より読みやすく、保守しやすいコードを使用してください。

于 2010-07-01T17:27:22.307 に答える
1

String.Contains()推測にすぎませんが、単純な部分文字列検索の場合、と regexのパフォーマンスにほとんど違いはString.IndexOf()ないと思います (どちらかといえば、regex は決して高速ではなく、わずかに遅くなる可能性があると思います)。

部分文字列よりも複雑なものに一致させる必要がある (またはそうなる) 場合を除き、正規表現への移行について考えるべきではありません。

于 2010-07-01T17:34:58.273 に答える
0

.Net 4.0 では、String.IndexOf 呼び出しに問題があります。ホットフィックス 2467309 を参照してください。回答を決定するのに役立つ場合があります。

于 2011-05-31T20:00:48.540 に答える