2012-03-23 20 views
3

2つのファイルを比較するプログラムがあります。私はビジュアルスタジオ分析を行い、比較時間が長いことを発見しました。これよりも2つの文字列を比較する方が速いのですか? (私はそれがエラーを引き起こす可能性があるので、foreachを使用することはできません)今はコンカレント辞書を使用していますが、私は他のオプションにも対応しています。すべての:)C#での文字列比較の高速化

var metapath = new ConcurrentDictionary<string, string>(); 
foreach(var me in metapath) 
{ 
if (line.StartsWith(me.Key.ToString())) 
{...} 
} 
+0

比較時間はどのくらいですか? – BoltClock

+0

ラインベースのアプローチが必要ですか?あなたの質問から完全には分かりません。ファイル全体を同等か、個々のテキストファイルの行と比較したいだけですか? –

+0

@BoltClockよくme.key.tostringは長さが8文字で、行は200-1000の間であり、すべての比較で約42秒かかります –

答えて

5

まず、me.Key.ToString()からToString()をドロップします。

次に、(これは正確に影響を与えないことを条件とする)序数文字列比較を使用する:

line.StartsWith(me.Key, StringComparison.Ordinal); 

標準文字列比較が等しい何上の様々なユニコード規則に従うため、これは有益です。例えば、正規化されたシーケンスと非正規化されたシーケンスは等しく扱われなければならない。 Ordinalは、生の文字データを比較し、Unicodeの等価ルールは無視します。このhereの詳細や、here(これは高速ですが、数字を引用しないことを主張しています)があります。

最後に、コードをプロファイルします。あなたは驚くでしょうが、ほとんどの場合、遅い部分はあなたが思うものではありません。たとえば、辞書に項目を追加する部分です。

+1

これがなぜ有益なのか説明できますか? –

1

あなたは正確に文字列を比較した場合、String.Equalsはかなり良いです:「それはあなたが「比較です」の意味を正確に明確ではないのですが、あなたはドン場合What is the fastest (built-in) comparison for string-types in C#

+0

申し訳ありませんが、私はちょうど最初の8文字を正確に比較していません –

0

String.Equals(line, me.Key) 

あなたがこれを見たことがありますtは「ソート」を意味します。つまり、あなたは盗作や何かをチェックしたいのですが、最初にラインをハッシュし、ハッシュを比較するのはどうですか?

これは、利点があるかどうかについてデータセットのサイズによって異なります。大小は非常に主観的な用語です。