C#中大量字符串拼接导致程序运行过慢奔溃等问题

C#中大量字符串拼接导致程序运行过慢奔溃等问题

    • 问题描述
    • 寻找解决办法
    • StringBuilder类
    • 常用方法
    • 总结
    • 参考

问题描述

  刚刚入职,需要根据给定的二进制文件翻译成大白话文,涉及到了很多优先级、帧号等等,前期编程过程中没有过多的注意加上没有拿实际数据测试,大量使用了拼接字符串(+、+=),在文本量or数据量很小的情况下运行很完美,几乎没什么卡顿,最后拿采集到的实际数据(50M左右二进制文件)进行测试时,程序运行奇慢无比,甚至会导致奔溃。

寻找解决办法

  寻求同事帮助,发现拼接字符串这一项上耗用太多时间,以及GC(Garbage Collector)回收不及时,轻轻松松程序就奔溃了。后来经过在网上查阅各类资料,发现在涉及大量字符串拼接的时候可以使用System.Text.StringBuilder类。

StringBuilder类

using System.Text;

StringBuilder myString = new StringBuilder();  //创建StringBuilder类的新实例
StringBuilder myString1 = new StringBuilder(50);  //该对象的容量
myString1.Capacity = 25;   //也可以这么设置容量
StringBuilder myString2 = new StringBuilder("yes,i do.",50);  // 这样也行

  StringBuilder对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值。此值称为该对象的容量。容量和字符数量不一样,当修改StringBuilder时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。个人认为可设可不设。

常用方法

方法名 用途
StringBuilder.Append 将信息追加到当前StringBuilder的结尾
StringBuilder.AppendFormat 用带格式文本替换字符串中传递的格式说明符
StringBuilder.Insert 将字符串或对象插入到当前 StringBuilder 对象的指定索引处
StringBuilder.Remov 从当前 StringBuilder 对象中移除指定数量的字符
StringBuilder.Replace 替换指定索引处的指定字符

  个人而言使用的比较多的是StringBuilder.Append、StringBuilder.AppendFormat ,具体用法如下:

using System.Text;

StringBuilder myString = new StringBuilder();  //创建StringBuilder类的新实例
myString.Append("添加的字符串文本1");
myString.Append("添加的字符串文本2");
string str1 = "字符串文本1";
string str2 = "字符串文本2";
string str3;
myString.AppendFormat("添加{0},添加{1}",str1,str2);
str3 = myString.ToString();

  使用时记得ToString()

总结

  1. 对于少量固定的字符串拼接可以使用“+”,如string str = “a” + “b” + “c”,则csc编译器会优化成 str = String.Concat(“a”, “b”, “c”); 不会创建多个字符串。如果写成 string str = “a”; s += “b”; s += “c”; 则会多创建3个新字符串。
  2. 字符串较少时,可以使用Stirng.Format()代替StringBuider。String.Format() : 字符串格式化,内部调用的是StringBuilder。
  3. 当操作大量字符串时,比如在循环体内or大量字符串拼接等等,一定要使用StringBuider!一定要使用StringBuider!一定要使用StringBuider!

参考

c#中stringbuilder的使用
C# .Net String字符串效率提高-字符串拼接
C#代码优化—字符串拼接效率比较
C# 性能优化——三种字符串拼接效率

你可能感兴趣的:(C#,c#,字符串,编程语言)