概述:在C#中,字元串連接有兩種實現方法:使用`+`運算符和使用`StringBuilder`。前者在每次連接時都會創建新的字元串對象,效率較低。後者通過內部管理字元數組,避免了頻繁的記憶體分配和垃圾回收,因此性能更高。在處理大量字元串連接時,使用`StringBuilder`可以顯著提高性能。這兩種 ...
概述:在C#中,字元串連接有兩種實現方法:使用`+`運算符和使用`StringBuilder`。前者在每次連接時都會創建新的字元串對象,效率較低。後者通過內部管理字元數組,避免了頻繁的記憶體分配和垃圾回收,因此性能更高。在處理大量字元串連接時,使用`StringBuilder`可以顯著提高性能。這兩種方法在功能上等價,但性能差異可達10倍或更多。 。
先上效果:
最近在和網友聊天時他問道:他做了一個生成代碼的小工具,生成一個文件很快,但生成一個項目時就會很慢,找不到原因,讓我幫分析一下是哪裡的問題。能過性能分析工具和查看相關代碼,發現他大量使用了字元串拼接,問題就出在這裡了,下麵來分析一下。
在C#中,字元串拼接時使用 string 和 StringBuilder 會導致性能差異的主要原因是,string 類型是不可變的,每次拼接都會創建一個新的字元串對象,而 StringBuilder 是可變的,可以在原始對象上進行操作,避免了創建新對象的開銷。
下麵分別演示使用 string 和 StringBuilder 進行字元串拼接的性能差異,並提供詳細的實例源代碼。
使用string和StringBuilder進行字元串拼接:
public static class Program
{
static void Main(string[] args)
{
//迴圈50000次
int start = 50000;
//測試5次每以50000的數量增加
for (int i = 0; i < 5; i++)
{
//迴圈次數
int end = start + (start * i);
//測量執行時間(單位為毫秒)
var executionTimer = GetExecutionTimer(() =>
{
//執行測試
Test1(end);
});
//測量執行時間(單位為毫秒)
var executionTimer2 = GetExecutionTimer(() =>
{
//執行測試
Test2(end);
});
Console.WriteLine($"{(i + 1)}:迴圈{end}次,Test1用時:{executionTimer}毫秒,Test2用時:{executionTimer2}毫秒");
Console.WriteLine($"{(i + 1)}:Test2是Test1的{((double)executionTimer / executionTimer2)}倍");
Console.WriteLine();
}
Console.ReadKey();
}
/// <summary>
/// 測試方法1
/// </summary>
static void Test1(int end)
{
string result = "";
for (int i = 0; i < end; i++)
{
result += i.ToString();
}
}
/// <summary>
/// 測試方法2
/// </summary>
static void Test2(int end)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < end; i++)
{
sb.Append(i);
}
string result = sb.ToString();
}
/// <summary>
/// 返回一個委托執行時間(通用)
/// </summary>
/// <param name="action">要執行的代碼塊</param>
/// <returns>代碼塊的執行時間(毫秒)</returns>
static long GetExecutionTimer(this Action action)
{
// 獲取當前時間戳
var stopwatch = new Stopwatch();
stopwatch.Start();
// 執行傳入的代碼塊
action();
// 停止計時
stopwatch.Stop();
// 返回執行時間
return stopwatch.ElapsedMilliseconds;
}
}
上述兩個示例中,使用 string 拼接字元串時,每次迴圈都會創建一個新的字元串對象,而使用 StringBuilder 則會在原始對象上進行追加,避免了創建多個對象。在迭代次數較多時,StringBuilder 的性能明顯優於直接使用 string。