论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
改一个对象类型,for循环耗时从3000毫秒下降到1毫秒 ...
改一个对象类型,for循环耗时从3000毫秒下降到1毫秒
火影
金牌会员
|
2024-4-12 09:55:43
|
显示全部楼层
|
阅读模式
楼主
主题
857
|
帖子
857
|
积分
2571
概述:
在C#中,字符串连接有两种实现方法:使用`+`运算符和使用`StringBuilder`。前者在每次连接时都会创建新的字符串对象,效率较低。后者通过内部管理字符数组,避免了频繁的内存分配和垃圾回收,因此性能更高。在处理大量字符串连接时,使用`StringBuilder`可以显著提高性能。这两种方法在功能上等价,但性能差异可达10倍或更多。 。
先上效果:
最近在和网友聊天时他问道:他做了一个生成代码的小工具,生成一个文件很快,但生成一个项目时就会很慢,找不到原因,让我帮分析一下是哪里的问题。能过性能分析工具和查看相关代码,发现他大量使用了字符串拼接,问题就出在这里了,下面来分析一下。
在C#中,字符串拼接时使用 string 和 StringBuilder 会导致性能差异的主要原因是,string 类型是不可变的,每次拼接都会创建一个新的字符串对象,而 StringBuilder 是可变的,可以在原始对象上进行操作,避免了创建新对象的开销。
下面分别演示使用 string 和 StringBuilder 进行字符串拼接的性能差异,并提供详细的实例源代码。
使用string和StringBuilder进行字符串拼接:
public static class Program
{
static void Main(string[] args)
{
//循环50000次
int start = 50000;
//测试5次每以50000的数量增加
for (int i = 0; i < 5; i++)
{
//循环次数
int end = start + (start * i);
//测量执行时间(单位为毫秒)
var executionTimer = GetExecutionTimer(() =>
{
//执行测试
Test1(end);
});
//测量执行时间(单位为毫秒)
var executionTimer2 = GetExecutionTimer(() =>
{
//执行测试
Test2(end);
});
Console.WriteLine($"{(i + 1)}:循环{end}次,Test1用时:{executionTimer}毫秒,Test2用时:{executionTimer2}毫秒");
Console.WriteLine($"{(i + 1)}:Test2是Test1的{((double)executionTimer / executionTimer2)}倍");
Console.WriteLine();
}
Console.ReadKey();
}
/// <summary>
/// 测试方法1
/// </summary>
static void Test1(int end)
{
string result = "";
for (int i = 0; i < end; i++)
{
result += i.ToString();
}
}
/// <summary>
/// 测试方法2
/// </summary>
static void Test2(int end)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < end; i++)
{
sb.Append(i);
}
string result = sb.ToString();
}
/// <summary>
/// 返回一个委托执行时间(通用)
/// </summary>
/// <param name="action">要执行的代码块</param>
/// <returns>代码块的执行时间(毫秒)</returns>
static long GetExecutionTimer(this Action action)
{
// 获取当前时间戳
var stopwatch = new Stopwatch();
stopwatch.Start();
// 执行传入的代码块
action();
// 停止计时
stopwatch.Stop();
// 返回执行时间
return stopwatch.ElapsedMilliseconds;
}
}
复制代码
上述两个示例中,使用 string 拼接字符串时,每次循环都会创建一个新的字符串对象,而使用 StringBuilder 则会在原始对象上进行追加,避免了创建多个对象。在迭代次数较多时,StringBuilder 的性能明显优于直接使用 string。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
火影
金牌会员
这个人很懒什么都没写!
楼主热帖
最全Windows98原版系统镜像下载(特点 ...
Spring Security登录表单配置(3) ...
SAP各模块优缺点和发展简析
Spring(SpringBoot)--解决拦截器中注入 ...
Linux 基本指令
Redis 原理 - String
用python反弹shell
Kubernetes(k8s)CNI(flannel)网络 ...
软件项目管理 4.3.敏捷需求建模方法 ...
微信小程序+web数据库的开发实践 ...
标签云
存储
挺好的
服务器
快速回复
返回顶部
返回列表