[C#技巧]使用StringBuilder比String消耗内存少
作者:admin 时间:2023-5-5 17:7:41 浏览:在我之前的文章中,我展示了一些C#性能优化的技巧,比较了一些代码的执行速度,你可以参考一下以下的文章:
在本文中,我将继续介绍C#的技巧,展示各种代码片段的内存消耗。
技巧 1:使用StringBuilder比String消耗内存少
在下面的示例中,我们将看到 String
和 StringBuilder
的内存分配图。以下是我对 String
和 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();
}
}
}
这是代码执行的内存分配图。
在这里,我们从主函数调用两个函数 Process()
, 尽管它们具有相同的名称,但它们属于不同的类,并且 Test1.Process
正在处理 String
数据,而 Test2.Process()
正在处理 StringBuilder
数据。在分配图中,我们可以看到 String
处理函数消耗了 Main()
函数 94% 的资源,而处理 StringBuilder
的 Test2 类中的 Process()
仅消耗了 Main()
函数资源的 21%。
因此,得出的结论是“当你想多次连接字符串时,始终使用 StringBuilder
”。
技巧 2:字符串格式 VS 字符串连接
在第一点中,我展示了 String
如何比 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% 的资源。
所以我们可以清楚地看到如果我们使用字符串连接而不是输出格式,我们可以节省我们的系统资源。
技巧 3:使用静态类或函数不消化内存
如果可能,请尝试实现静态函数,因为静态对象(函数和数据)不属于特定类的任何对象,所以如果你不创建一个对象那么就不存在内存消耗的问题。下面我将展示一个静态函数和静态类的示例。并查看 IL 代码。
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 static class mySclass
{
public static void Print()
{
Console.Write("Hello");
}
}
public class myNclass
{
public static void Print()
{
Console.Write("Hello");
}
}
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 1000; i++)
{
mySclass.Print();
myNclass.Print();
}
}
}
}
IL 代码在左侧,右侧是 CLR 分析器获取的前几个内存消耗类。由于空间消耗,我无法显示 CLR 分析器的完整屏幕截图。但是相信我(哈哈)静态类或函数是没有内存分配的。
由此,我们可以得出的结论是“如果可能,请尝试创建一个静态函数并使用类名调用,而不是通过对象名调用通用函数”。
总结
本文介绍了几个消耗内存较少的C#技巧,因为内存消耗对程序运行速度影响很大,所以这些技巧能帮助我们优化C#的性能。
相关文章
- 站长推荐