2012-02-03 23 views

答えて

9

はい、あります:私は、迅速な実験を実行し、文字列のバージョンが約3倍遅いようです。

string a = "quickbrownfoxjumpsoverthelazydog"; 
    DateTime t1 = DateTime.Now; 
    for (int i = 0; i != 10000000; i++) { 
     var b = a.Replace('o', 'b'); 
     if (b.Length == 0) { 
      break; 
     } 
    } 
    DateTime t2 = DateTime.Now; 
    for (int i = 0; i != 10000000; i++) { 
     var b = a.Replace("o", "b"); 
     if (b.Length == 0) { 
      break; 
     } 
    } 
    DateTime te = DateTime.Now; 
    Console.WriteLine("{0} {1}", t2-t1, te-t2); 

1.466s対4.583s

文字列と、過負荷がoldStringのすべての文字を通過するために余分なループを必要とするので、これは、驚くべきことではありません。このループは正確に1回実行されますが、オーバーヘッドはまだ存在します。

+0

感謝!関心のうち – Laguna

+1

+1、誰もがSystem.String.ReplaceInternalのオーバーロードをリバースエンジニアリングすることができますか?私はDevがchar overloadで不変性を観察したかどうかを知りたいです:) – StuartLC

5

私はstring.Replace(char, char)と予想されます。これは、正確な容量のスペースを正確に割り当てることができるためです。私はそれが多くの現実世界のアプリケーションで重要なパフォーマンスの違いを作るだろうとは思わない。

さらに重要なのは、私はそれがより読みだと言うだろう - それはあなたが本当に同じ長さの文字列で終わるだろうことを明確です。

3

String.Replace(char, char)は高速です。理由は簡単です。

  • シャアの交換は、異なるサイズの文字列を割り当てる必要はありません、文字列置換が最初に新しいサイズを見つけるか、
  • シャアの交換にはない、交換用StringBuilderを使用する必要があります文字列の範囲でチェックする必要があります。あなたはABCACABCACのような文字列を持っていて、ABCを交換したい想像してみてください。 3つの文字が一致しているかどうかを調べる必要があります。文字を扱うときには、1つの文字だけを見つけるだけです。テストプログラムのための
関連する問題