2012-02-03 77 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 VS 4.583s

這並不奇怪,因爲用繩子超載需要額外的循環要經過oldString的所有字符。該循環只運行一次,但開銷仍然存在。

+0

感謝您的測試計劃! – Laguna 2012-02-03 14:23:27

+1

+1出於興趣,是否有人能夠對System.String.ReplaceInternal的重載進行逆向工程?我有興趣看看Dev是否在char超載上觀察到了不變性:) – StuartLC 2012-02-03 14:27:02

5

我會預計string.Replace(char, char)可能會更快,因爲它可以分配恰到好處的空間。不過,我懷疑它會在許多真實世界的應用程序中產生顯着的性能差異。

更重要的是,我會說它更具可讀性 - 更清晰的是,你最終會得到一串相同長度的字符串。

3

String.Replace(char, char)更快。原因很簡單:

  • 字符替換並不需要分配一個字符串具有不同的尺寸,字符串替換需要找出新的規模第一,或者使用StringBuilder用於替換
  • 字符替換不需要使用一系列字符串進行檢查。想象一下你有一個像ABCACABCAC這樣的字符串,並且你想替換ABC。你需要找出3個字符是否匹配,當使用字符時,你只需要找到一個字符。