2010-09-30 59 views
5
string str = 'my {0} long string {1} need formatting'; 

我應該做以下,在這種情況下什麼會更快String.Format或String.Replace?

str = string.Format(str, "really", "doesn't"); 

或創建一個方法,像這樣並呼籲str = str.ReplaceWithValues("really", "doesn't");

public string ReplaceWithValues(this string str, params object[] values) { 
    string ret = str; 
    for (int i = 0; i < values.Length; i++) { 
     ret = str.Replace(string.Concat("{", i, "}"), values.ToString()); 
    } 
    return ret; 
} 

好像StringBuilder.AppendFormat()當談到效率不高做這樣簡單的替換,因爲它通過字符串逐個字符。

+0

你需要這樣一個極端的性能調整,或者你只是好奇嗎? – 2010-09-30 17:12:28

+0

@Claudio Redi - 我只是好奇。 – 2010-09-30 17:13:32

+0

「看起來像'StringBuilder。AppendFormat()'在進行這種簡單的替換時效率不高,因爲它通過字符串逐個字符。「你認爲'string.Replace'是什麼? – mquander 2010-09-30 17:21:45

回答

14

爲什麼要重新創建String.Format?

我只是用框架方法 - 它正是你想要的,是強大的,而且將會是有意義的那些跟隨...


只是爲了滿足好奇心的:

看起來像StringBuilder.AppendFormat()是不高效的,因爲它做這樣簡單的替換,因爲它逐字符串通過字符串。

String.Format,FYI,在內部使用StringBuilder.AppendFormat。這就是說,StringBuilder.AppendFormat非常高效。你提到它通過字符串「逐個字符」 - 但是,在你的情況下,你使用了多個對Replace和Concat的調用。使用StringBuilder單次傳遞字符串可能會更快。如果你真的需要知道,你可以通過簡介來檢查。在我的機器,我得到以下計時,如果我同時運行100萬次以上的:

String.Format - 1029464 ticks 
Custom method - 2988568 ticks 
+0

我只是好奇。沒有任何計劃進入開發階段。 – 2010-09-30 17:14:52

+0

@Jeremy:我只是編輯了我的答案來幫助你的好奇心 - 正如你所看到的,框架方法在每一個數字上都更好。 ;) – 2010-09-30 17:25:38

+0

剛做了100次每個10k的迭代,我的自定義方法是速度的1/2。在查看StringBuilder.AppendFormat()的代碼後,這很奇怪。 – 2010-09-30 17:31:46

1

如果你想要的是連接一些字符串,爲什麼不這樣做呢?

string result = "my " + x + " long string " + y + " need formatting"; 

string result = string.Concat("my ", x, " long string ", y, " need formatting"); 
+0

同樣的原因任何人都使用string.Format ...它比一堆concats更清潔。 – 2010-09-30 17:15:46

+0

+1這是最快的解決方案 - 'string.Concat'在內部使用非託管方法來創建一個新字符串。 – 2010-09-30 17:38:02

+0

在你的例子中,它並不算太壞,但它會帶有一些更復雜的字符串:''[{0}] {1}:{2}。「'變成'」[「,x,」]「,y, 「:」,z,「。」'。或用引號:'「attr1 = \」{0} \「attr2 = \」{1} \「」'變成'「attr1 = \」「,x,」\「attr2 = \」「, 「」'。哪一個更清楚?然後你可以添加像'{0:C}'這樣的格式,這也進一步簡化了它。 – 2010-09-30 17:42:07

2

定製過程將增加其成本與每個附加的佔位符,並且產生不重磨串垃圾收集一起Replace每個中間呼叫。

除了string.Format比多次呼叫Replace快得多的可能性之外,string.Format還包括對文化敏感操作的重載。

string.Format的靈活性和直觀性至少與速度一樣引人注目。

+0

+1對文化敏感 – 2010-09-30 17:18:02

0

在C#中,+運算符實際上變成了一個string.Concat(),我一直認爲String.Format("Hello: {0} {1}", "Bob", "Jones")是最快的。事實證明,在發佈模式下,在調試器外部運行一個樣本之後,"Bob" + "Jones"要快得多。儘管有一個截點。我相信大約8個連接左右,string.Format變得更快。

+0

我認爲這是因爲''Bob「+」Jones「'將在發佈模式下在編譯時被優化爲」BobJones「' – Andy 2017-07-11 07:27:30

相關問題