C#学习笔记_StringBuilder+程序效率测试

String问题:当程序中进行过多字符串处理操作时,会在内存中产生过多垃圾信息,影响程序效率。

StringBuilder简介

StringBuilder为一个类,属于引用类型。StringBuilder与string的区别在于,StringBuilder对于字符串的操作,总是在同一内存空间实现,不会产生垃圾数据,执行效率更高。

使用方法

一、创建对象

下面使用变量sb进行演示:

cs 复制代码
StringBuilder sb=new StringBuilder();    //创建StringBuilder变量sb

注意,使用StringBuilder需要依赖System.Text命名空间。

二、向sb追加数据

此时会需要两个函数:

  1. sb.Append(i):向sb中追加数据;
  2. sb.ToString():将sb转换为字符串。

使用上面的sb,对其进行操作:

cs 复制代码
//向sb中追加数据
sb.Append("StringBuilder");
sb.Append(1234);
sb.Append(false);
sb.Append(1.23);
for (int i = 0; i < 5; i++) sb.Append(i);   //使用循环追加数据
//将sb转换为字符串后输出
Console.WriteLine("输出"+sb.ToString());   //输出StringBuilder1234False1.2301234

可见,追加数据,即将对应数据以类似字符串形式添加在原有数据之后。实际Append有多种重载,可以添加很多数据类型。

借助于ToString,即可将sb以字符串形式输出。

三、清空sb

清空sb使用函数Clear。

cs 复制代码
//清空sb
sb.Clear();
Console.WriteLine("此时无sb输出" + sb.ToString());   //此时无sb输出

四、插入数据

使用Insert方法可以向sb中选定位置插入数据。假设上面sb未被清空:

cs 复制代码
//插入数据
sb.Insert(6, "Insert");     //在索引值为6的字符前插入字符串"Insert"
Console.WriteLine("插入后sb输出:" + sb.ToString());  
//插入后sb输出:StringInsertBuilder1234False1.2301234

五、删除子字符串

通过Remove方法,可以将选定索引之后的一定长度子字符串删除。

cs 复制代码
//删除子字符串
sb.Remove(6, 6);    //从索引值为6的字符开始,删除6字符长度的子字符串
sb.Remove(13,18);  
//两参数必须完整,不能认为只填写前一个参数即可清空选定位置后全部字符串
Console.WriteLine("输出" + sb.ToString());   //输出StringBuilder

测试效率

测试效率可以通过程序执行时间参考。程序执行时间测量,需要使用Stopwatch类,该类型依赖于System.Diagnostics命名空间。

使用Stopwatch类,一般通过如下操作测量时间:

  1. Stopwatch sw = new Stopwatch()可创建Stopwatch类变量;
  2. sw.Start()开始计时;
  3. sw.Stop()结束计时;
  4. sw.Elapsed表示开始到结束的时长,输出格式为"时:分:秒.小数后7位"。

现在尝试分别向string与StringBuilder类追加5万条字符串,测量代码实例:

cs 复制代码
//创建Stopwatch变量
Stopwatch sw1 = new Stopwatch();
Stopwatch sw2 = new Stopwatch();

//string类测试追加效率
string s = "";
sw1.Start();
for(int i = 0; i < 50000; i++)
{
    s += "addString";
}
sw1.Stop();
Console.WriteLine("string类追加5万字符串用时为" + sw1.Elapsed);

//StringBuilder类测试追加效率
StringBuilder sb = new StringBuilder();
sw2.Start();
for (int i = 0; i < 50000; i++)
{
    sb.Append("addString");    
}
sw2.Stop();
Console.WriteLine("StringBuilder类追加5万字符串用时为" + sw2.Elapsed);

观察输出结果:

string类追加5万字符串用时为00:00:05.3519927

StringBuilder类追加5万字符串用时为00:00:00.0007908

对比可见,StringBuilder类效率远超string类。

本段代码实际也是一段程序效率测试的实例,在程序效率测试方面也可以进行参考。

相关推荐
handler016 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
电子云与长程纠缠6 小时前
UE5 两种方式解决Decal Actor贴花拉伸问题
学习·ue5·游戏引擎
red_redemption6 小时前
自由学习记录(172)
学习·cache line 64b·重用距离
阿荻在肝了7 小时前
Agent学习六:LangGraph学习-持久化与记忆一
python·学习·agent
寒秋花开曾相惜9 小时前
(学习笔记)4.1 Y86-64指令集体系结构(4.1.4 Y86-64异常&4.1.5 Y86-64程序)
开发语言·jvm·数据结构·笔记·学习
莹宝思密达9 小时前
【AI学习】 playwright-cli + SKILL 替换 chrom-devTools-MCP
学习
cyr___9 小时前
Unity教程(二十七)技能系统 黑洞技能(下)黑洞状态
学习·游戏·unity·游戏引擎
Theodore_10229 小时前
深度学习(15):倾斜数据集 & 精确率-召回率权衡
人工智能·笔记·深度学习·机器学习·知识图谱
不会聊天真君6479 小时前
JavaScript基础语法(Web前端开发笔记第三期)
前端·javascript·笔记
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.10 小时前
Redis主从复制配置全攻略
数据库·redis·笔记