2009-07-31 3 views

答えて

12

オプションb)のために、細かい

をするか、またはしますは、部分文字列をループすることは非常に非効率的です。

最速の方法は

C)を直接文字列文字上ループ、読み取り専用インデクサプロパティを使用して次のようになります。

IEnumerable<char>インタフェースに基づい
for (int i = 0; i < s.Length; i++) { char c = s[i]; ... } 

または、:

foreach(char c in s) { ... } 
2

研究よりも、いくつかの大規模な文字列で、両方のルーチンをプロファイルおよび/または答えを待つために速くなるだろうが、私は推測していた場合、私は

1

Bを賭ける思いは奇妙に聞こえます。ちょうど推測するが、は速く、確かに分かりやすい。

EDIT:あなたは、ヤー古いインデックスをしたい場合は したがって、

for (int i = 0; i < s.Length; i++) 
    //Do something with s[i] 

は、いくつかのLINQやり過ぎ

s.Select((i, c) => //i being index, c the char, or the other way round, I forget at times); 
6

(A)がはるかに効率的です。しかし、なぜちょうどません。

foreach (char c in s) 

をいくつかの簡単なベンチマークは、これが

for(int i = 0; i < s.Length; ++i) 
    char c = s[i]; 

よりほんの少し(< 2%の差)あまり効率的である。しかし、私の意見は、前者作るの読みやすさであることを示しています最も重要なコード以外は何も優れていません。

+0

私は覚えています...私はできません。インデックスは関連性があります。それで、私は「反復する」の代わりに「ループする」と言うことにしました。 –

+0

int index = 0; foreach(char c in s){コードインデックス++; } – luiscubal

+0

@luis:Nah ...あまりにも。 –

3

あなたがしようとしていることによって異なります。

特定のインデックスの文字を調べるか、それとも新しい文字列を作成するだけですか?

SubString()は新しい文字列を返します。これは、あなたがしようとしていることに応じて、不必要なオーバーヘッドを引き起こす可能性があります。問題の明確な説明が役立ちます。

また、事前に最適化しないでください。より生産的な方法でコードを書いてください。それをプロファイルし、ボトルネックを引き起こした場合はこの問題に対処してください。

+0

"あらかじめ最適化しないでください":問題は、私が正しく証明したアルゴリズムを実装しようとしていることです。できるだけ効率的に書きたいと思っています。それはどこにでもボトルネックを引き起こすことはありません。だから、私は実際には*プレミアムではありません。ただ最適化する。 –

+0

あなたがそれを遠く離れていれば、それを両方の方法で実行して違いを測ることができます。そしてそれが違いを生み出すかどうかを評価し、そうであれば、その測定に基づいてアプローチを選択します。 –

+0

@Carl:はい、おそらく正しいでしょう。私のC#コーディングスキルは、私の数学スキルの後ろにうまくいきません...ストップウォッチ以外のプロファイル方法もわかりません... –

1

なぜ文字列をchar配列に変換するのですか?何をやっている正確

char c = s[i]; 
0

:あなたは個々の文字を取得することができますStringクラスのインデクサがありますか?あなたが実行している文字列操作のための最適化されたメソッドがある場合、それはあなたが思いつくあらゆる種類のループよりもはるかに優れています。簡単な例として:部分文字列を使用したが、それはあなたにそれは私がis.Wgyとしてのorignal文字列が残る新しい文字列を与えるだろうことを覚えていますが

File.ReadAllText(...); 
... 
foreach (match in Regex.Match(..., RegexOptions.Multiline)) 
    ... 
0

File.ReadAllLines(...); 
... 
Regex exp = new Regex(..., RegexOptions.Compiled); 
foreach (line) 
    exp.Match(...); 

はより遅くずっとです.NETがその文字列をインターンするので、元の文字列はそのまま残っていると言うので、将来のインスタンスはインテルプールから同じ不変の文字列を引き出し、パフォーマンスヒットは無視できます。コンピュータサイエンスでは、文字列インターンは、それぞれ異なる文字列値のコピーを1つだけ保存する方法であり、変更不可能でなければなりません。インターン文字列は、文字列の作成や保留に時間を要するという代償を払って、文字列処理タスクをより時間的または空間的に効率的に処理します。別個の値は、文字列プールに格納されます。各文字列の単一のコピーは、その 'intern'と呼ばれ、通常、文字列クラスのメソッドによって参照されます。 新しい文字列を作成するたびに部分文字列を使用する 部分文字列の代わりにforループオプションを選択します。

string str = "TestString"; 
for (int i = 0; i < str.Length; i++) 
{ 
    char c = str[i]; 
} 
関連する問題