2013-07-31 14 views
5

Joe Duffy's Blogは、string.Substringを使用することのほうがstring.Splitより効率的です。String.SplitよりもString.Substringの方が効率的ですか?

Substringというメソッドでは、新しい文字列が割り当てられないのか、不要な割り当てが行われないので効率が良いのか分かりません。それがより効率的であることを説明し、例を示すことができますか?

私は彼の最初の例として、配列を作成し、配列内の各文字列を処理することを理解しています。

string str = ...; 
string[] substrs = str.Split(','); 
foreach (string subtr in substrs) { 
Process(substr); 
} 

方法以下れるより効率的な

string str = ...; 
int lastIndex = 0; 
int commaIndex; 
while ((commaIndex = str.IndexOf(',', commaIndex)) != -1) { 
    Process(substr, lastIndex, commaIndex); 
    lastIndex = commaIndex + 1; 

私は何を参照して、文字列を処理し、その後、コンマのインデックスを見つけるために、String.IndexOfを使用しています。私は彼が処理中にデータを抽出するためにString.Substringを使うつもりだと思う。以下のコメントの1つは、彼が文字ごとにそれを引っ張っているかもしれないことを示唆している。おそらくcharの配列を構築する次のコンマにヒットするまで、彼は文字を引っ張っているだろうか?

+0

はいsting.Index ofはカンマのインデックスを検索するために使用されますが、仮のプロセスメソッドの内部では、これらのインデックス内のデータを抽出するために部分文字列を作成する必要があります。右? –

+0

私は訂正されました - 例は本当に混乱しています – BrokenGlass

+0

"String.SplitとString.Substringのようにそこに潜んでいる地雷APIがあります"と言うと、 'Substring'は効率的ではないと思います。 "文字列はインデクサーを持っているので、型セーフなので、少なくとも部分的にはバッファオーバーランにつながることはない"とは、文字単位で文字にアクセスすることを意味します。 'Substring'を使って。 – Blorgbeard

答えて

7

良い悲しみ。

古いジョーク:マネージャーは、プログラマーAまたはプログラマーBがプログラマーの方がいいかどうかを知りたかったので、コンテストを開催しました。彼らは両方とも、与えられた複雑な問題を解決するためのプログラムを書くことになり、最高のプログラムを書いた人が勝つでしょう。

2人のプログラマーが回答を提出しました。プログラマーAのプログラムは最も速く走っていて、プログラマーBがプログラマーAのプログラムによって提供された答えがちょっとだったと指摘したとき、マネージャーは彼を勝者に宣言しようとしていました。

「しかし、私のプログラムはまだ最速のですが、私は勝つために値する」、プログラマA.答えは正しいことをしていない場合、私はあなたより10倍高速でプログラムを書くことができます」

言いました"、レモートされたプログラマーB.

Joe Duffyの2番目の例では、string.Split()の使用を避けていますが、間違っています。それはコンパイルされません。変数 "substr"は未定義です。

私は私のケースを休んでいます。

+0

良いジョーク、:)、私はそれが大好きです。 – David

+1

ニースのジョークですが、私はあなたのポイントが何であるか分かりません。 Joe Duffyの間違いは単純なタイプミスです。彼は "substr"ではなく "str"と言っていました。 – Blorgbeard

+4

@Blorgbeard:彼は誤ってコードを壊してしまったと思う。あなたが複雑になればなるほど、そのようなものが忍び寄る可能性が高くなります。特に、複雑さが増しているならば。彼のケースを助けてくれるのではない。部分文字列についての嫌疑を始め始める前に、コードをテストしたりプロファイリングしたりするのを邪魔しなかったという証拠です。実際にそれをVSに入力してコンパイルすると、エラーが明らかになりました。 – cHao

関連する問題