技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营

赞助商

分类目录

赞助商

最新文章

搜索

[C#技巧]使用StringBuilder比String消耗内存少

作者:admin    时间:2023-5-5 17:7:41    浏览:

在我之前的文章中,我展示了一些C#性能优化的技巧,比较了一些代码的执行速度,你可以参考一下以下的文章:

在本文中,我将继续介绍C#的技巧,展示各种代码片段的内存消耗。

技巧 1:使用StringBuilder比String消耗内存少

在下面的示例中,我们将看到 StringStringBuilder 的内存分配图。以下是我对 StringStringBuilder 执行相同操作的代码。

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#的性能。

相关文章

x
  • 站长推荐
/* 左侧显示文章内容目录 */