当前位置: 首页 > news >正文

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

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

StringBuilder简介

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

使用方法

一、创建对象

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

StringBuilder sb=new StringBuilder();    //创建StringBuilder变量sb

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

二、向sb追加数据

此时会需要两个函数:

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

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

//向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。

//清空sb
sb.Clear();
Console.WriteLine("此时无sb输出" + sb.ToString());   //此时无sb输出

四、插入数据

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

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

 五、删除子字符串

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

//删除子字符串
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万条字符串,测量代码实例:

//创建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类。

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

相关文章:

  • CVE-2024-23897 Jenkins 任意文件读取漏洞
  • 【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
  • Ubuntu环境vscode配置Log4cplus库
  • vue3常用代码
  • thinphp 调用 \think\Log::write 写入回调日志信息
  • 手机操作系统Android
  • [UI5 常用控件] 02.Title,Link,Label
  • 《WebKit技术内幕》学习之十五(2):Web前端的未来
  • 重学java 11 封装
  • Spring Security 存储密码之 JDBC
  • 【C++】类和对象(中篇)(全网最细!!!)
  • 【C++11并发】mutex 笔记
  • 华为三层交换机之基本操作
  • leetcode88合并两个有序数组
  • python爬虫框架Scrapy
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [Vue CLI 3] 配置解析之 css.extract
  • [译]CSS 居中(Center)方法大合集
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Android Volley源码解析
  • create-react-app项目添加less配置
  • django开发-定时任务的使用
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript-Array类型
  • Linux中的硬链接与软链接
  • Object.assign方法不能实现深复制
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 百度小程序遇到的问题
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 力扣(LeetCode)21
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 使用docker-compose进行多节点部署
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 思否第一天
  • 学习Vue.js的五个小例子
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 移动端高清、多屏适配方案
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (算法)N皇后问题
  • (原)Matlab的svmtrain和svmclassify
  • (原)本想说脏话,奈何已放下
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .Net Core和.Net Standard直观理解