這陣子再重新閱讀設計模式,想到了 String 與 StringBulder 的對比,裡面應用了 Builder 這個模式;後來想到這兩者的差異也沒紀錄,這次就順手紀錄一下
兩者的主要差異是在動態處理資料時,資源使用程度。
string 是參考型別,所以每次在動態處理資料時,都會再配置一個新的記憶體給它,但是原本使用的資源雖然最終交由 GC(Garbage Collection) 回收,但是在回收之前資源卻已經浪費掉了。
- StringBuilder
使用了 Builder 模式,會維護一個緩衝區,以容納新資料。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void Main() { Stopwatch sw = new Stopwatch(); StringBuilder sb = new StringBuilder(); String str = ""; sw.Start(); for (int i = 0; i < 10000; i++) { str += i.ToString(); } sw.Stop(); Console.WriteLine("String Class :" + sw.ElapsedMilliseconds);
sw.Reset(); sw.Start(); for (int i = 0; i < 10000; i++) { sb.Append(i.ToString()); } sw.Stop(); Console.WriteLine("StringBuilder Class:" + sw.ElapsedMilliseconds); }
|
動態處理 100000 筆資料的花費時間,輸出結果如下圖
參考資料