C#和C++字符串拼接的性能分析
程序员文章站
2022-05-30 09:15:13
...
内容会持续更新,有错误的地方欢迎指正,谢谢!
字符串操作是编程中非常频繁的操作,下面是字符串拼接效率的提升方法:
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进行对比,总体运行效率差不多:
下一篇: 拼接字符串