[英]Why is String.Concat not optimized to StringBuilder.Append?
[英]Multiple StringBuilder.Append calls vs. single .Append with inner string concat
在.NET中使用字符串生成器來處理.Append方法的多個調用,而不是在串聯其參數時對.Append的單個調用,最佳實踐是什么?
sb.Append(name).Append("; ");
與
sb.Append(name + "; ");
當一個使用另一個時,會有性能損失嗎? 在某些情況下,第二個變體可能更具可讀性(並且編寫起來更短)。
用短字符串進行這樣的簡單字符串連接是否會使使用字符串生成器的性能/內存增益無效?
因此,我進行了一次測試,使用了三種方法在100,000次循環中追加文本。
(1)
text += "Hello" + i.ToString();
(2)
sb0.Append("Hello" + i.ToString());
(3)
sb1.Append("Hello");
sb1.Append(i.ToString());
結果是(1)花費了108,332ms,(2)花費了18ms,(3)花費了19ms。
因此,事實證明,簡單串聯比對字符串生成器的兩次連續調用要快得多。 我懷疑這與垃圾回收有關,與構建字符串的實際速度無關。
最重要的是,只要字符串相對較小,就可以使用字符串連接而沒有任何麻煩。
第二種方法比第一種慢(盡管可以說不是很多,所以如果它有助於提高可讀性,就不會受到損害)。 作為經驗法則:適當時使用string.Format
或string.Concat
,在循環中添加內容時使用StringBuilder
。
我已經使用這種方法進行了一些性能測試:
var strings = Enumerable.Range(100000, 200000).Select(x => x.ToString()).ToArray();
var watch = new Stopwatch();
watch.Start();
for (var i = 0; i < 100000; ++i)
// whatever method
var result = ...; // e.g. sb.ToString();
watch.Stop();
WriteResultToFile(result); // prevent optimizations
Console.WriteLine("Took: " + watch.ElapsedMilliseconds + "ms");
結果如下:
// Method 1: 39317ms
str += strings[i] + ", ";
// Method 2: 8ms
sb.Append(strings[i] + ", ");
// Method 3: 2ms
sb.Append(strings[i]);
sb.Append(", ");
// Method 4: 15ms
sb.Append(string.Format("{0}, ", strings[i]));
但是,如果您要連接的字符串數量固定,請使用string.Concat
因為它可以預先確定結果長度,因此性能非常好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.