字符串优化

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#编写二维码图片识别代码。 步骤一:安装ZXing.NET库 首先,我们需要安装一个叫做ZXing.NET的二维码解析库。你可以在NuGet上找到这个库,并通过Visual Studio的程序包管理器安装它。 或者,你可以在ZXing.NET的GitHub页面上下载源代码并手动…

    C# 2023年6月1日
    00
  • 基于AForge实现C#摄像头视频录制功能

    基于AForge实现C#摄像头视频录制功能攻略 1. 背景介绍 AForge是一款基于C#的开源机器视觉框架,支持多种图像处理和机器学习算法。除此之外,AForge还提供了许多常用的工具类,如IO、数字信号处理、多媒体等。本文将介绍如何使用AForge框架实现C#摄像头视频录制功能。 2. 实现步骤 2.1 引用AForge框架 在Visual Studio…

    C# 2023年6月3日
    00
  • C#集合Collections购物车Shopping Cart(实例讲解)

    C#集合Collections购物车Shopping Cart(实例讲解) 这篇文章将向您介绍如何使用C#集合实现购物车功能。购物车是电商网站中非常常见的功能之一,它允许用户将他们感兴趣的商品加入到购物车中,随时查看购物车中的商品数量和总价等信息,最终下单付款。 实现思路 为了实现购物车功能,我们需要以下几个步骤: 在页面展示商品列表,并为每个商品提供一个“…

    C# 2023年6月7日
    00
  • .Net Core读取文件时中文乱码问题的解决方法分享

    .NET Core读取文件时中文乱码问题的解决方法分享 在使用.NET Core读取含有中文字符的文件时,有时会出现中文字符乱码的问题。这是因为在不同的编码方式下,中文字符会以不同的方式表示。本文将详细介绍读取文件时中文乱码问题的解决方法,并提供两个示例。 问题分析 先来看一个示例: string contents = System.IO.File.Read…

    C# 2023年6月3日
    00
  • asp.net SqlParameter如何根据条件有选择的添加参数

    在ASP.NET中,SqlParameter是用于向SQL语句中添加参数的类。有时候,我们需要根据条件有选择地添加参数。本文将介绍如何使用SqlParameter根据条件有选择地添加参数。 根据条件有选择地添加参数 在使用SqlParameter时,可以使用if语句或三元运算符等条件语句来判断是否需要添加参数。以下是示例: string sql = &quo…

    C# 2023年5月15日
    00
  • 使用C#实现在屏幕上画图效果的代码实例

    下面是使用C#实现在屏幕上画图效果的完整攻略。 目录 准备工作 绘制线段 绘制多边形 示例说明一:绘制简单的三角形 示例说明二:绘制带填充的矩形 准备工作 在C#中,我们可以通过System.Drawing命名空间下的Graphics类来实现在屏幕上的画图效果。在使用之前,需要进行如下准备工作: 引用命名空间 using System.Drawing; 创建…

    C# 2023年6月6日
    00
  • 不使用web服务(Service)实现文本框自动完成扩展

    实现文本框自动完成扩展是一种常见的Web开发任务,它可以帮助用户快速输入和选择文本。在本攻略中,我们将介绍如何不使用Web服务(Service)实现文本框自动完成扩展,并提供两个示例来说明其用法。 以下是两个示例,介绍如何不使用Web服务(Service)实现文本框自动完成扩展: 示例一:使用jQuery UI实现文本框自动完成扩展 首先,我们需要引入jQu…

    C# 2023年5月15日
    00
  • C# 实现简单打印的实例代码

    C# 实现简单打印的实例代码 简介 在 C# 中,我们可以通过 System.Drawing.Printing 命名空间提供的 PrintDocument 类来实现简单的文本打印。 步骤 1. 引入命名空间 使用 PrintDocument 类需要引入 System.Drawing.Printing 命名空间。 using System.Drawing.Pr…

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