2016-11-05 24 views
1

是否使用string.Format這樣的:當使用帶有許多參數的string.Format時,什麼是更高性能:string或StringBuilder?

string.Format(txt, arg0, arg1, arg2, arg3, arg4,...) 

是等於說txt+=args;從而創建新的對象,每次它追加在的args列表的新字符串?並更好地使用StringBuilder.Format

+2

你爲什麼不[嘗試比賽你的馬](https://ericlippert.com/2012/12/17/performance-rant/)? – Steve

+0

你的意思是嘗試像這樣:'string st =「」; (int i = 0; i <9000; i ++) { st + =「dop」; 「它太快了!雖然它是災難性的循環,爲什麼?因爲它創建了9000個對象。如何知道'StringBuilder.Format'是否通過測試傳播對象? –

+2

只要你有這樣的問題,首先看[參考源代碼](https://referencesource.microsoft.com/#mscorlib/system/string.cs,691a34e179b91fdb)。 StringBuilderCache應該說服你,框架代碼不會吸引,也不需要你的幫助。 –

回答

1

我的上述評論意味着你應該在你的環境中測試你的表演。使用Stopwatch實例,創建一個循環,該循環至少運行在string.Format和StringBuilder.AppendFormat上十萬次,然後測量Stopwatch.ElapsedMilliseconds中的值。這大概會給你一個差異的想法。

在礦山環境中,兩種方法非常相似。在100000循環不同的是2/3毫秒優勢的StringBuilder但士氣是:

DO NOT DO MICROOPTIMIZATIONS

(除非你有絕對明確的結果值得的努力)。

樣品:

string s1 = "Argument 1"; 
string s2 = "Argument 2"; 
string s3 = "Argument 3"; 
string s4 = "Argument 4"; 
string s5 = "Argument 5"; 
string s6 = "Argument 6"; 
string s7 = "Argument 7"; 
string s8 = "Argument 8"; 
string s9 = "Argument 9"; 

string result = string.Empty; 
object[] data = new object[] { s1, s2, s3, s4, s5, s6, s7, s8, s9 }; 
Stopwatch sw = new Stopwatch(); 
sw.Start(); 
for(int x = 0; x < 100000; x++) 
    result = string.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8}", data); 
sw.Stop(); 
Console.WriteLine(sw.ElapsedMilliseconds); 

StringBuilder sb = new StringBuilder(); 
sw = new Stopwatch(); 
sw.Start(); 
for (int x = 0; x < 100000; x++) 
{ 
    sb.Length = 0; 
    sb.AppendFormat("{0},{1},{2},{3},{4},{5},{6},{7},{8}", data); 
    result = sb.ToString(); 
} 
sw.Stop(); 
Console.WriteLine(sw.ElapsedMilliseconds); 
+0

有沒有辦法在運行時看到'string + ='創建的對象? –

+1

不清楚。你在說什麼東西?字符串是不可變的,因此,每次調用+ =運算符時,都會創建一個新字符串,其中包含變量的前一個值以及添加的字符串。然後將新字符串分配給您的變量。 – Steve

0

的String.Format使用其實施StringBuilder的,所以你不能說哪一個更好。

相關問題