0

(申し訳ありませんが、これは文字列の長さを判断する最も効率的な方法 != 0?への 2 番目の投稿ですが、人々の回答に返信する方法がわかりません。返信は「回答」として投稿されます)

理想的には、私が探しているのは、次のことを行うための最も効率的なアルゴリズムです (これは 1 億回以上呼び出されます)。私はC#4.0を使用しています

文字列 "ABCDE " を次の配列に変換します: string["A","B","C","D","E"]

私のアルゴリズムは次のとおりです。

public string[] SplitOnMultiSpaces(string text)
{
  if (string.IsNullOrEmpty(text)) return new string[0];

  var split = text.Split(' ');
  int length = split.Length;

  var data = new string[length];

  int index = 0;
  for (int i = 0; i<length; i++)
  {
    if (split[i].Length != 0)
    {
      data[index++] = split[i];
    }
  }

  return data;
}

私の問題は、これを 100,000 個の文字列に対してプロファイリングすると、実行に 1.04 秒かかることです。

「if (split[i].Length != 0)」チェックをコメントアウトすると、わずか 0.2 秒しかかかりません。

文字列に対するこの (単純な) クエリが、TOTAL 実行時間の 80% を占めている理由を誰か教えてもらえますか? (特に、他の領域がより多くの CPU を使用することを期待していたので) 私が思いついた唯一のアイデアは、C# が文字列の長さを数えようとしているということです。 ?)。しかし、それは時間のオーバーヘッドには意味がありません。

split[i][0] が存在するかどうかを確認しようと考えましたが、例外に依存すると WAAAAAAY が遅くなります。

PS - 私のアルゴリズムは、多くの場合、返された配列が必要以上に大きくなるという点でも問題がありますが、オーバーヘッドはそれほど大きくないようです。

4

4 に答える 4

3

あなたができることと同じか、それよりも速い可能性があります(低レベルのコード、別名C / C ++に入る必要はありません)。

// somewhere else
private static readonly char[] splitter =  new []{' '} ;

//
public string[] SplitOnMultiSpaces(string text)
{
    return text.Split(splitter, StringSplitOptions.RemoveEmptyEntries );
}
于 2010-08-02T18:38:59.117 に答える
2

空の文字列チェックを不要にする StringSplitOptions を取る String.Split オーバーロードを使用してパフォーマンスを比較しましたか?

于 2010-08-02T18:38:00.773 に答える
1

あなたはちょうど置き換えることができます

var split = text.Split(' ');

var split = text.Split(' ', StringSplitOptions.RemoveEmptyEntries);

しかし、これもプロファイリングする必要があります。

于 2010-08-02T18:40:23.000 に答える
0

これをデバッグ モードまたはリリース モードでベンチマークすると、「if (split[i].Length!=0)」が存在するかどうかに関係なく、実質的に同一のランタイムが得られます。両方とも最速タイムに対応します。(したがって、長さが簡単なチェックであるという考えをサポートします。) 他の方法でパフォーマンスに影響を与える可能性があることが示されていないものはありますか?

そうは言っても、 StringSplitOptions.RemoveEmptyEntries が最善の方法であることに同意したいと思います。しかし、なぜ元の動作を再現できないのか、私はまだ興味があります。

于 2010-08-02T18:50:00.090 に答える