2016-04-20 12 views
4

パフォーマンスの場合には、次のコードのほうが優れていますか?最初の例でパフォーマンスの文字列対文字列

private void ReplaceChar(ref string replaceMe) { 
    if (replaceMe.Contains('a')) { 
    replaceMe=replaceMe.Replace('a', 'b'); 
    } 
} 

private void ReplaceString(ref string replaceMe) { 
    if (replaceMe.Contains("a")) { 
    replaceMe=replaceMe.Replace("a", "b"); 
    } 
} 

含有する第二使用して文字列の中にいる間、私は(、CHARを使用)及び(交換)

最初のものがあるため、より少ないメモリを消費する「文字」の優れた性能を持っているだろうコンパイラはこの操作でキャストする必要がないので、2番目の方がうまく動作しますか?

(あるいは、これはすべてのナンセンスである、CLRは、両方のバリエーションで同じコードを生成する原因?)

+0

私は文字列のレクリエーションが実際の交換より悪いと思います。 –

+2

文字列を割り当てる必要がなく、文字のグループ(文字列)に対して単一の文字を検索する方が簡単で、 'Replace'実装は返されるサイズを知っています文字列をあらかじめ用意しておく必要があります。追加の割り当てを行う必要はありません。しかし、知る唯一の方法は測定することです。 –

+0

Contains()を含むifは不要ですか? Replace()は既にそれが含まれているかどうかをチェックします。 – Johan

答えて

8

あなたは2頭の馬を持っており、より高速であるかを知りたい場合は...

String replaceMe = new String('a', 10000000) + 
        new String('b', 10000000) + 
        new String('a', 10000000); 

    Stopwatch sw = new Stopwatch(); 

    sw.Start(); 

    // String replacement 
    if (replaceMe.Contains("a")) { 
    replaceMe = replaceMe.Replace("a", "b"); 
    } 

    // Char replacement 
    //if (replaceMe.Contains('a')) { 
    // replaceMe = replaceMe.Replace('a', 'b'); 
    //} 

    sw.Stop(); 

    Console.Write(sw.ElapsedMilliseconds); 

Char交換の場合は ms、Stringの場合は ms(Core i5 3.2GHz、64ビット、.Net 4.6)です。だから、

replaceMe = replaceMe.Replace('a', 'b') 

は交換のほとんどはCLR内部で行われ、それが頻繁に最適化されているので、私たちは、コードをテストすることなく確実に知ることができない程度9回速く

+0

正直なところ私は測定をしませんでした。なぜなら、その違いがper mille地域のどこかにあると予想していたからです。本当に測定可能な違いがあることを知っておいてよかった。 BTW:2つの馬が100万回実行すると、2つの死亡馬が最も多く発生するでしょう: –

+0

なぜdownvote? –

+0

の価値があるのは、私たちが30ミリオンの文字列でこれをやっていることです。「遅い」バージョンはまだ1秒未満しかかかりませんでした。あなたが実際に事実を判断し、これがアプリケーションのボトルネックであるという具体的な証拠を持っていない限り、このような測定値をあまり読みすぎないようにしてください。両方とも、想像力のあるアプリケーションのために「十分に速い」よりも速いです。 – kai

0

です。 charは、コードが簡単で結果がより予測可能であるため、ある程度のパフォーマンス上の利点があります。charを置き換えると、元の文字と同じ文字数が常に得られます。

置き換え自体の性能はあまり重要ではありません。タイトなループでは、 '古い'文字列の割り当てとガベージコレクションは置換自体よりも大きな影響を与えます。

関連する問題