字符串优化

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/p/17339209.html

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

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

相关文章

  • C#求解哈夫曼树,实例代码

    C#求解哈夫曼树,实例代码 什么是哈夫曼树? 哈夫曼树是一种二叉树,它的权值在叶子节点处,而非根节点处。它是一种带权路径长度最短的树,被广泛应用在文件压缩和编码中。 求解哈夫曼树的过程 求解哈夫曼树的过程分为三步: 构建森林:将每一个权值看做一个点,将所有点作为森林的初始状态。 构建哈夫曼树:对于森林中的每一对最小权值节点,合并它们并将合并后的点重新放回森林…

    C# 2023年5月31日
    00
  • C#内置队列类Queue用法实例

    C#内置队列类Queue用法实例 本文将详细讲解C#内置队列类Queue的用法,包括如何创建队列、添加元素、删除元素、获取队列中元素数量等操作。 创建和初始化队列 在C#中,可以使用Queue类来创建一个队列。T代表存储在队列中的元素类型。我们可以在创建队列的同时指定元素类型,也可以在后续操作中动态添加元素类型。下面是一个创建包含整数的队列的示例: Queu…

    C# 2023年6月7日
    00
  • C#实现的简单随机数产生器功能示例

    下面我将为您详细讲解如何实现C#的随机数产生器功能示例。 1. 什么是随机数 随机数是指在一定范围内的数字,由于没有特定的规律和模式,所以看起来就像是随机产生的数字。在程序设计中,随机数被广泛应用于生成随机数据,加密算法,游戏开发等领域。 2. C#实现随机数产生器 在C#中,产生随机数可以使用Random类。下面是一个简单的示例,演示了如何使用Random…

    C# 2023年6月7日
    00
  • C#实现图形位置组合转换的方法

    C#实现图形位置组合转换的方法 在C#中,通过使用矩阵转换可以实现图形位置组合的转换。该方法包含两个部分:矩阵的生成和矩阵的应用。 矩阵的生成 通过创建Matrix类实例来生成矩阵,可以调用它的一些方法来定义矩阵,如平移、旋转和缩放等。以下是几个常用的矩阵生成方法: 平移矩阵 平移矩阵可以将图形向上或向下、向左或向右移动。可以使用Matrix类的Transl…

    C# 2023年6月8日
    00
  • C# DataTable使用方法详解

    C# DataTable使用方法详解 什么是DataTable DataTable是一个用于表示和操作内存中表格数据的类,它模拟了数据库中的数据表,包含了一行一列的数据,每列都有唯一的名称和类型,并且可以通过对DataTable进行填充、查询、排序、筛选等操作,来完成数据的管理和处理。 如何创建DataTable 可以通过以下步骤来创建DataTable: …

    C# 2023年6月1日
    00
  • HttpWebRequest实现下载图片至本地

    下面我来详细讲解如何用 HttpWebRequest 实现下载图片至本地: 1. HttpWebRequest 简介 HttpWebRequest 是 .NET Framework 提供的一个类,用于创建 HTTP 请求并与 Web 服务器进行通信。使用 HttpWebRequest 可以发送 GET、POST 和其他 HTTP 请求,在本例中,我们将使用 …

    C# 2023年5月31日
    00
  • 利用JQuery直接调用asp.net后台的简单方法

    当使用 ASP.NET 进行 Web 开发时,常常需要通过 Ajax 技术实现与后台服务器的数据交互,实现无刷新或部分刷新的效果。JQuery 是一个流行的 JavaScript 库,它可以轻松地实现与后台 ASP.NET 及其他服务器端语言的交互。 下面是几个简单方法,利用 JQuery 直接调用 ASP.NET 后台程序以及如何从后台程序返回数据。 一、…

    C# 2023年6月3日
    00
  • .NET垃圾回收器(GC)原理浅析

    . 标题 为了让读者更好地理解.NET垃圾回收器(GC)的原理,本文将从以下几个方面进行分析: 1. 垃圾回收的概念 首先,我们需要了解垃圾回收的概念。在.NET中,所有的对象都是分配在托管堆(Managed Heap)中的,而堆的管理和维护是由GC负责的。GC会定期检查堆中的对象,识别出哪些对象是不再被使用的,然后将其回收,释放所占用的空间。 2. 垃圾回…

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