始终使用Stringbuilder进行字符串连接操作
这一点对开发人员来说非常关键。在进行大量字符串拼接操作时,请使用StringBuilder代替String。为了演示它对代码性能的影响,我准备了以下示例代码。我在for循环中执行了500次字符串拼接操作。
public classTest{public static string Name { get; set; }public static string surname;}class Program{static void Main(string[] args){string First = "A";StringBuilder sb = new StringBuilder("A");Stopwatch st = new Stopwatch();st.Start();for (int i = 0; i < 500; i++){First = First + "A";}st.Stop();Console.WriteLine("Using String :-" + st.ElapsedTicks);st.Restart();for (int i = 0; i < 500; i++){sb.Append("A");}st.Stop();Console.WriteLine("Using Stringbuilder :-" + st.ElapsedTicks);Console.ReadLine();}}
这是输出:
我已经展示了在长连接操作的场景中字符串的速度有多慢。这里我们会看到一个字符串和StringBuilder的内存分配图。让我来演示一下。下面是我使用字符串和StringBuilder进行相同操作的代码。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Diagnostics;using System.IO;using System.Net;using System.Net.NetworkInformation;using System.Threading;using System.Globalization;using System.Data.SqlClient;namespace Test1{public class Test1{string Name ;public void Process(){Name = Name + "A";}}public class Test2{StringBuilder sb = new StringBuilder();public void Process(){sb.Append("A");}}class Program{static void Main(string[] args){Test1 t = new Test1();t.Process();Test2 t1 = new Test2();t1.Process();}}}
这是代码执行时的内存分配图。
这里我们从main函数调用两个函数Process();尽管它们都有相同的名称,但它们属于不同的类和Test1.Process处理字符串数据,而Test2.Process()处理StringBuilder数据。在分配图中,我们可以看到字符串处理函数消耗了Main()函数94%的资源,而Test2类中处理StringBuilder的Process()只消耗了Main()函数的0.21%的资源。
因此,结论是“当你想多次连接字符串时,总是使用StringBuilder”。
字符串格式化VS字符串连接
在第一点中,我展示了字符串如何比StringBuilder消耗更多的资源。在这一点上,我将比较格式化输出和字符串连接。在第一个函数中,我使用了一个格式规范来打印格式化的输出(基本上是连接一个字符串)。在另一个函数中,我使用(+)操作符连接一个字符串,如下所示:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Diagnostics;using System.IO;using System.Net;using System.Net.NetworkInformation;using System.Threading;using System.Globalization;using System.Data.SqlClient;namespace Test1{class Test{public void Format(){int a = 100;Console.WriteLine("{0}AND{1}", a, a);}public void Concatination(){int a = 100;Console.WriteLine(a + "AND" +a );}}class Program{static void Main(string[] args){Test t = new Test();t.Format();t.Concatination();Console.ReadLine();}}}
在内存分配中我们会看到:
使用format打印字符串的函数消耗了57%的资源,而简单连接两个字符串的函数消耗了主函数的30%的资源。因此,我们可以清楚地看到,如果使用字符串连接而不是输出格式化,就可以节省系统资源。
