工作時,寫到大量(迴圈...之類)字串串連時,採用"+"的方式,有資深工程師給予超有用的建議!!如下↓
Q:在程式中,大量字串相加使用"+"可能會導致校能問題。
EX: string test = "a" + "b" ;
=> test = "ab"
看似簡單的字串相加但在程式中使用多次也會影響效能。
【原因】
1.轉型問題
由此可知 C# 的加號( + )運算子預設就支援字串串加的功能,只要一群字串串接的物件中只要有一個以上的物件型別是「字串」的話,就會全部變成「字串相加」,只要遇到「非字串」的物件,預設會使用繼承至 object 物件的 ToString() 方法進行轉型,讓所有物件都變成「字串」後進行相加動作。如果物件回傳值為 null 的話,也會改以空字串替代。
2.記憶體浪費
String 類別:每次動態處理資料時會捨棄舊有的記憶體,然後再配置一個新的記憶體給它,雖然最終程式會交由GC回收,但是在回收之前資源卻已經浪費掉了。StringBuilder:類別 則是會維護一個緩衝區,以容納新資料,如果有可用的空間,新的資料會附加至緩衝區的尾端;若緩衝區不夠的話它會新增一個較大的緩衝區並把舊有的資料複製過去,新的資料再附加至緩衝區的尾端。
但是若是在固定字串的話使用 string 類別,效能就不比 StringBuilder 類別 差了。
【建議】
【簡單範例】
string.Concat 與 string + string 比較
[string.Concat]
[string + string]
使用簡單的C# Fiddle 來實驗 觀察 一些相關效能,就能明顯看到差異。
看起來是有差別,要是有問題,還是要在多試試。
參考:
【MSDN 串連字串】
https://msdn.microsoft.com/zh-tw/library/ms228504.aspx
【保哥】
http://blog.miniasp.com/post/2009/02/01/CSharp-Addition-operator-for-string-concatenation.aspx
沒有留言:
張貼留言