字符串优化

C#字符串优化学习总结

内存区域

我们知道一个由C/C++编译的程序占用的内存分为以下几个部分:

1、栈区(stack): 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap) : 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3、全局区(静态区)(static):全局变量和静态变量的存储都是在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域, 程序结束后有系统释放 。

4、常量区:常量、字符串常量池就是放在这里的, 程序结束后由系统释放 。

5、程序代码区:存放函数体的二进制代码。

C#常量池

C#也有自己的常量池,也就是我们所称的暂存池(string intern pool),C#的字符串常量池不在堆中也不在栈中,是独立的内存空间管理,在内存的常量区,由CLR(Common Language Runtime)维护这段内存。

其中,我们定义的例如string a = "HelloWorld";"HelloWorld"这个我们定义的字面量就存储在常量区中。如果再定义一个string b = "HelloWorld",这时候CLR就会去字符串常量池中找,如果存在相同内容的字符串对象的引用,则将这个引用返回。否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。

关于常量池的理解:

  1. 常量池由CLR来维护,其中的所有字符串对象的值都不相同。

  2. 只有编译阶段的文本字符常量会被自动添加到常量池。

  3. 运行时期动态创建的字符串不会被加入到常量池中。

  4. string.Intern()可以把动态创建的字符串加入到常量池中。

即使这个动态创建的字符串和常量池中的某个字符串的值相等,引用也不会相等。

即使是动态创建的两个字符串的值相等,他们的引用依然不相等。(charArray.ToString()特例)

字符串内存优化的核心原则有三个:

1、复用字符串,减少字符串数量

2、降低不可复用字符串的占用的内存

3、降低运行时产生的GC字符串内存

关于string拼接和StringBuilder拼接

1、在处理字符串时:string是只可读不可写的,在进行字符串拼接时,往往是创建一个string对象,然后栈中的内存指向堆中的新内存,在创建对象时需要分配内存空间,之前的内存则会产生GC。而StringBuilder是存在于System.Text命名空间下的在原来的内存中修改,不需要分配内存空间。
2、从内存优化方面来说,虽然StringBuilder在拼接后仍需要调用ToString()将拼接后的内容转换成不可写的字符串,但是相比较下来,频繁的字符串操作StringBuilder更好。
3、从功能上来说string仍然比StringBuilder更强。
4、string主要用于公共API,通用性好,读取性能高,占用内存小。
5、StringBuilder主要用于拼接string,修改性能好。
6、string是不可变的,所以天然线程同步。
7、StringBuilder可变,非线程同步。
如果是处理字符串的话,用string中的方法每次都需要创建一个新的字符串对象并且分配新的内存地址,而StringBuilder是在原来的内存里对字符串进行修改,所以在字符串处理方面还是建议用StringBuilder这样比较节约内存。但是string类的方法和功能仍然还是比StringBuilder类要强。

关于string+int

string之所以可以与int相加,根本上是调用了Concat方法。首先intobject需要装箱,然后Concat内部调用了所有objectToString方法,然后再new一个字符串返回。而Concat方法其实接受的是object类型的对象,这也就是说,string在与int相加的时候,会造成装箱操作。而ToString()会产生28B的GC,装箱会产生20B的GC,所以在拼接时,显式的调用ToString()可以规避掉装箱的过程,使用string+int.ToString()会比string+int更加节省性能

【字符串性能相关的操作】

1.创建空字符串用用string s = string.Empty,而不是string s = ""

2.高频字符串拼接用stringbuilder,或者字符串格式化string.Format()string.Format()实际上就是利用stringbuilder去实现的

3.ToUpperToLower这类方法均会重新生成字符串,看看是否可以避免使用

4.true判断时,用"value" == string是最快的;false判断时,用"value".Equals(string)是最快的

原文链接:https://www.cnblogs.com/x-zhi/archive/2023/04/21/17339209.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:字符串优化 - Python技术站

(0)
上一篇 2023年4月22日
下一篇 2023年4月22日

相关文章

  • C#中Lambda表达式的三种写法

    下面我将为你讲解C#中Lambda表达式的三种写法的完整攻略。 1. 简单Lambda表达式 在C#中,我们可以使用Lambda表达式来简化匿名方法的编写。Lambda表达式有三个部分组成:参数列表、箭头(Lambda符号)和Lambda方法体,在下面的例子中,我们使用Lambda表达式实现了一个简单的加法方法: int Add(int a, int b) …

    C# 2023年6月1日
    00
  • C#/VB.NET实现创建PDF/UA文件的示例代码

    我们来详细讲解一下“C#/VB.NET实现创建PDF/UA文件的示例代码”的完整攻略。 首先,我们需要了解一些基本的概念。PDF/UA是一种通用的文件格式,用于文档的可靠共享和阅读。PDF/UA文件需要遵循一定的规范和标准,以确保文件的可访问性和实用性。创建PDF/UA文件的过程中,我们需要使用特定的工具和方法,以确保文件的合规性和质量。 以下是创建PDF/…

    C# 2023年5月31日
    00
  • Unity 如何设定 Animator分割播放

    接下来我将为你详细讲解如何设定Animator分割播放。 什么是Animator分割播放 Animator分割播放是指将动画Clip分割成若干段进行播放,根据具体的游戏需求控制各段的播放顺序、单次播放次数、循环播放次数等。 设定Animator分割播放的步骤 步骤一:打开Animator窗口 在Unity编辑器中,双击要添加分割播放的动画角色的Animato…

    C# 2023年6月3日
    00
  • C#与C++动态链接库DLL参数互传方式

    首先,C++和C#是两种不同的编程语言,它们的数据类型和交互方式也有所不同。C++和C#动态链接库(DLL)参数互传方式有很多种,下面我将详细讲解两种常见的方式。 1. 使用C++的“__declspec(dllexport) ”和C#的“DllImport”特性 使用该方法时,我们需要在C++的DLL函数定义前面加上__declspec(dllexport…

    C# 2023年5月15日
    00
  • 如何使用ASP.NET Core 配置文件

    以下是“如何使用ASP.NET Core配置文件”的完整攻略: 什么是ASP.NET Core配置文件 ASP.NET Core配置文件是一种用于存储应用程序配置信息的文件。配置文件可以包含应用的各种设置,例如数据库连接字符串、日志级别、身份验证设置等。ASP.NET Core提供了一种方便的方式来读取和配置文件。 如何使用ASP.NET Core配置文件 …

    C# 2023年5月12日
    00
  • C#实现拼手气红包算法

    C#实现拼手气红包算法攻略 简介 拼手气红包是一种大家熟悉的红包形式,在微信等社交软件中广受欢迎。拼手气红包算法即为在一定的规则下,随机分配一定数量的金额给参与者,深受大众喜爱。本篇攻略将介绍如何使用C#实现拼手气红包算法。 步骤 步骤一:确定算法规则 在实现拼手气红包算法前,需要确定红包的基本规则。下面是拼手气红包的基本规则: 红包的总金额为固定值。 红包…

    C# 2023年6月8日
    00
  • C# 重写Notification提示窗口的示例代码

    下面是详细讲解“C# 重写Notification提示窗口的示例代码”的完整攻略: 一、什么是Notification提示窗口 Notification提示窗口就是Windows操作系统的一个提示框,一般用于通知用户系统的一些状态变化或提示信息。它一般弹出在屏幕的右下角,显示一定的时间之后会自动消失。 二、怎样重写Notification提示窗口 要重写No…

    C# 2023年6月7日
    00
  • 浅谈C#中正则表达式的使用

    浅谈C#中正则表达式的使用 正则表达式是对字符模式的描述和匹配的一种语法工具,在C#中对正则表达式的支持非常好。本文将详细介绍在C#中如何使用正则表达式,包括正则表达式的语法、使用方法,以及常见的示例。 正则表达式的语法 正则表达式使用一些特殊字符表示模式的匹配规则,其中一些字符具有预定义的含义,也有一些字符需要使用转义等特殊处理。以下是正则表达式常用的字符…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部