字符串优化

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日

相关文章

  • VS2012 程序打包部署图文详解

    VS2012 程序打包部署图文详解 在开发过程中,我们往往需要将自己开发的程序打包部署,让其他人可以方便地安装和使用我们的程序。本攻略将介绍如何使用 VS2012 打包部署程序。下面将详细讲述打包部署程序的步骤。 1.在 Visual Studio 中创建安装程序项目 打开 Visual Studio,点击“文件”–>“新建”–>“项目”,在…

    C# 2023年6月3日
    00
  • C#中ValueTuple的原理详解

    C#中ValueTuple的原理详解 什么是ValueTuple? ValueTuple是.NET Framework 4.7版本中的一种值类型,它可以让我们在不创建类和结构体的情况下定义带有名称的元组。元组是一组有序但不像数组和列表那样可扩展的项,每个项都可以是不同类型的数据。 这使得有时我们不需要定义一个类或结构体来存储多个值。 ValueTuple原理…

    C# 2023年5月31日
    00
  • asp.net php asp jsp 301重定向的代码(集合)

    下面是详细讲解“asp.net php asp jsp 301重定向的代码(集合)”的完整攻略: 什么是301重定向? 301重定向是将一个URL的请求永久性转移到另一个URL的过程。它通常用于网站改版或重构时,将旧的不再使用的URL地址重定向到新的页面地址,不影响用户体验,同时也有利于搜索引擎的优化。 asp.net实现301重定向的代码 在asp.net…

    C# 2023年5月31日
    00
  • C#实现简单学生成绩管理系统

    C#实现简单学生成绩管理系统 一、需求分析 本系统是一个简单的学生成绩管理系统,包括学生信息录入,成绩录入,成绩查询和统计等功能。软件运行需求:.Net Framework 4.0以上 二、技术选型 编程语言:C# 数据库:MS SQL Server 开发环境:Visual Studio 2017以上版本 三、数据库设计 本系统需要一个用于存储学生信息和成绩…

    C# 2023年6月3日
    00
  • WPF创建Prism应用程序

    WPF 创建 Prism 应用程序的完整攻略 Prism 是一个用于构建 XAML 应用程序的开源框架,它提供了一组工具和库,帮助开发人员构建可扩展、可重用和易于维护的应用程序。本攻略将介绍如何使用 Prism 创建 WPF 应用程序,并提供两个示例说明。 步骤 步骤1:创建 WPF 应用程序 首先,我们需要创建一个 WPF 应用程序。可以使用 Visual…

    C# 2023年5月17日
    00
  • .net中的Span类和Memory类介绍

    .NET中的Span类和Memory类介绍 在.NET中,Span类和Memory类是用于处理内存的重要类型。本攻略将介绍这两个类的基本概念、用法和示例。 Span类 Span类是一个结构体,用于表示一段连续的内存区域。它可以用于读取和写入内存,而无需进行复制或分配。Span类的定义如下: public ref struct Span<T> { …

    C# 2023年5月17日
    00
  • C#检查字符串是否是合法URL地址的方法

    C#中检查字符串是否是合法的URL地址,可以通过正则表达式实现。下面是一份完整的攻略: 步骤1:导入需要使用的命名空间 在代码文件的顶部,导入以下两个命名空间: using System; using System.Text.RegularExpressions; 步骤2:编写正则表达式 正则表达式是用来检测字符串是否合法URL的关键。下面是一个常用的URL…

    C# 2023年6月8日
    00
  • C#多线程之Semaphore用法详解

    C#多线程之Semaphore用法详解 概述 Semaphore 用来控制同时访问特定资源的线程数量,可以用来实现线程的同步和互斥。Semaphore 维护了一个计数器,表示可用的资源数量。每个线程在访问资源之前都需要对 Semaphore 进行等待,如果 Semaphore 的计数器大于 0,则线程可以继续执行,同时 Semaphore 的计数器会减 1,…

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