C#和C++字符串拼接的性能分析

26 篇文章 7 订阅

内容会持续更新,有错误的地方欢迎指正,谢谢!

字符串操作是编程中非常频繁的操作,下面是字符串拼接效率的提升方法:

C#中字符串的拼接

1.字符串和整数进行拼接时,应减少装箱

string是引用类型,值类型与引用类型之间的转换存在装箱与拆箱操作;将值类型转换成引用类型的操作叫装箱,将引用类型转换成值类型叫拆箱。
字符串和整数进行拼接操作时,并不默认调用ToString()方法,存在装箱操作。所以:

var str1 = "a"+1;//存在装箱,效率低
var str2 = "a" + 1.ToString();//效率更高
2.字符串和字符串进行拼接时,应避免分配额外的内存

字符串对象一旦被赋值就不可改变,在运行时进行任何运算(如“=”、“+”等),都会在内存中创建一个新的字符串对象(分配新的内存)

var str1 = "a";
str1 += "b";//在运行时进行拼接,又创建了2个字符串对象
var str2 = "a" + "b";//在编译时进行拼接,等效于var str2="ab",效率高

string是引用类型,存在堆上,用的时候传的是内存中的地址,每次修改都会重新创建一个新的string对象来存储字符串:

string str="a";//先在内存中分配空间,存储str变量的对象,值为"a"
str+="b"+"c";//+=时 重新创建一个对象来存新字符串“abc",把str指向新的地址,释放原地址。

大量字符串拼接时,使用StringBuilder

String是不可变长的,StringBuilder是可变长的,初始容量是16个char,每次扩容都会扩容到当前字符串的2倍长度,就不存在创建新对象这种问题,从而提高了性能、减少了内存占用(因为GC回收垃圾不是实时性的,会等一段时间,确定的确不再用了才释放内存)。

var str1 = "a"; str1 += "b"; str1 += "c"; str1 += "d";

///效率更高,尤其是在处理大量字符串的时候或者是在循环里面
var str2 = new System.Text.StringBuilder("a");
str2.Append("b"); str2.Append("c"); str2.Append("d");

所以,只有简单几步拼接时,不会有太大问题,如果有时候需要循环拼接时,就会不断创建新的对象,很浪费性能和内存

总结
var str1 = "a" + 1;// 存在装箱,效率低
var str2 = "a" + 1.ToString();// 效率更高

var str3 = "a"; str3 += "b";//在运行时进行拼接,又创建了2个字符串对象
var str4 = "a" + "b";//在编译时进行拼接,等效于var str2="ab",效率高
var str5 = new System.Text.StringBuilder("a"); str5.Append("b"); //效率更高

C++中字符串的拼接

1.使用str += "a", str =str+ "a" 效率差距

str =str+ "a"会产生一个新对象,再把结果返回
str += “a” 是对象的引用,操作之后直接返回引用,避免了产生新的对象

这里写图片描述

2.使用append

string str;
str.append(str);

将其与str+=a进行对比,总体运行效率差不多:

这里写图片描述

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值