3

要するに、スピードは私にとって本当に重要です。ミリ秒ごとなので、どの方法が最速かを知りたいです。

私は私のプログラムです。さまざまなフラグ (フラグ [1] - フラグ [7]) を持つさまざまなケースがあります。出力を処理する方法を確認するには、入力をさまざまなパターン (パターン [1] - パターン [7]) のいずれかに一致させる必要があります。だからここに質問があります、文字列をパターン[1]と一致させる方が良いですか、一致する場合はそれを処理し、そうでない場合はパターン[2]と一致させようとします(ほとんどの場合、一致を7回行います)またはすべてのパターンを配置します次のような分割で1つの正規表現に:

"^[patterns[1]|pattern[2]|...]$

一致するかどうかを確認し、一致する場合は、文字列を分割してフラグ値を取得し (常に最後にあります)、それに応じて処理しますか?

つまり、結論: 1 つのマッチとスプリットに対する 7 つの異なるマッチ。

注: 提供されたデータに基づいて、7 つの一致を並べ替えようとします。そのため、発生する可能性が最も高いものが最初に一致します。

この質問は時間を重視したいと思いますが、提案と意思決定のために、最初の一致後に文字列が受け入れられる確率は約 91.3% です。

4

2 に答える 2

2

あなたの検索基準が何であるか正確にはわかりません。一致する文字列が常に最後にあることをほのめかします。ここでは、一般的な考え方を示す簡単な時間テストをいくつか示します。テストは 2 つの文字列を検索します。最初の文字列はターゲットに存在せず、2 番目の文字列は存在します。

string.IndexOf 240 nanoseconds (to find string anywere in string, not just at end)
string.EndsWith 210 nanoseconds
Regex.Match 1,285 nanoseconds
precompiled Regex 648 nanoseconds

テストコードは以下です。これは、結果からタイミング テストのオーバーヘッド (ブラケット ループなど) を取り除く、私が書いた小さなベンチマーク ユーティリティを使用します。私は正規表現の専門家ではないので、私の検索パターンが文字列テストと同等であることを願っています。

string s = "zzzzzzzzzzzzzzzzzzzzzzzsomething";
string search1 = "thinker";
string search2 = "something";
int pos = 0;
new Bench().Time("string.IndexOf", (c) => {
    for (int i = 0; i < c; i++) {
        if ((pos = s.IndexOf(search1)) < 0) {
            pos = s.IndexOf(search2);
        }
    }
});
bool found = false;
new Bench().Time("string.EndsWith", (c) => {
    for (int i = 0; i < c; i++) {
        if (!(found = s.EndsWith(search1))) {
            found = s.EndsWith(search2);
        }
    }
});
string pattern = "(" + search1 + "|" + search2 + ")$";
Match match = null;
new Bench().Time("Regex.Match", (c) => { for (int i = 0; i < c; i++) match = Regex.Match(s, pattern); });
Regex regex = new Regex(pattern, RegexOptions.Compiled);
new Bench().Time("precompiled", (c) => { for (int i = 0; i < c; i++) match = regex.Match(s); });
于 2013-05-02T16:42:53.150 に答える