字符串优化

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#实现的xml操作类完整实例

    下面是详细讲解“C#实现的XML操作类完整实例”的完整攻略。 简介 在C#开发中,我们需要对XML文件进行读取、写入和修改等操作,这时候一款优秀的XML操作类就显得十分重要。本文将介绍一款C#实现的XML操作类的完整实例,包括类的定义、读取XML文件、写入XML文件和修改XML文件等操作。 类的定义 首先,我们需要定义一个XML操作类,这个类需要包含读取、写…

    C# 2023年5月31日
    00
  • c#转换全角半角方法示例

    当我们需要对用户输入的字符或文本进行处理时,经常需要将全角字符转换为半角字符或者将半角字符转换为全角字符。c#中提供了相应的方法来实现这些功能。下面是一个完整的示例说明“c#转换全角半角方法”的攻略。 1. 转换全角到半角 使用 System.Text.RegularExpressions.Regex 类的 Replace 方法可以实现将全角字符转换为半角字…

    C# 2023年6月8日
    00
  • C#实现批量更改文件名称大小写或扩展名

    下面是详细讲解“C#实现批量更改文件名称大小写或扩展名”的完整攻略。 问题描述 有时候我们需要将多个文件的名称进行更改,例如将文件名称的大小写规范化,或者将文件的拓展名更改为另一种形式。手动更改一两个文件可以使用Windows资源管理器来完成,但如果需要更改数量较多的文件,则手动操作将非常费时费力。因此,我们需要一种批量操作的方法。 解决方案 我们可以使用C…

    C# 2023年6月1日
    00
  • C# 使用 Castle 实现 AOP及如何用 Autofac 集成 Castle

    一、什么是AOP AOP(Aspect Oriented Programming,面向切面编程)是一种编程思想,是对OOP(Object Oriented Programming,面向对象编程)的补充和完善。它将程序中的关注点分为核心关注点和横切关注点,其中核心关注点指的是程序核心业务逻辑,横切关注点指的是与核心业务逻辑无关的代码,例如日志、事务、缓存等等。…

    C# 2023年5月15日
    00
  • ASP.NET Forms身份认证详解

    ASP.NET Forms身份认证是一种常用的身份验证机制,用于验证用户在网站上的身份信息。本文将详细讲解ASP.NET Forms身份认证的完整攻略,包括如何设置、实现以及如何进行验证等方面的内容。 1. ASP.NET Forms身份认证设置 要使用ASP.NET Forms身份认证,需要在Web.config文件中添加以下配置: <configu…

    C# 2023年6月3日
    00
  • C# .NET中Socket简单实用框架的使用教程

    C#.NET中Socket简单实用框架的使用教程 什么是Socket框架? Socket框架是一种网络编程模型,被广泛应用于各种网络通信应用程序的开发中,包括聊天工具、文件传输、视频会议等。Socket框架通过封装了底层的TCP/IP协议,提供了一种简单、灵活且高效的网络编程模型。通常情况下,使用Socket框架编写网络应用程序需要掌握C#语言和.NET框架…

    C# 2023年5月15日
    00
  • 浅谈JsonObject中的key-value数据解析排序问题

    浅谈JsonObject中的key-value数据解析排序问题——攻略 问题描述 在使用JsonObject进行key-value数据解析时,有时我们会发现得到的数据不是按照期望的顺序排列的。这个问题会给我们的主观体验带来很大不便,并且也可能对我们的后续工作造成困扰。所以在这篇文章中,我们将会讨论这个问题的产生原因以及解决方案。 问题产生的原因 当我们使用J…

    C# 2023年6月1日
    00
  • Asp.Net中的字符串和HTML十进制编码转换实现代码

    下面我将详细讲解如何在 Asp.Net 中实现字符串和 HTML 十进制编码的转换。 什么是字符串和 HTML 十进制编码? 在 Asp.Net 中,字符串就是一串字符(可以包含字母、数字、符号等),我们可以将其在程序中进行处理、传递和展示。而 HTML 十进制编码则是将字符按照其在 ASCII 表中对应的值进行转化,用十进制数字表示。 用 Asp.Net …

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