性能最优的StringBuilder实例复制实现方法是什么?
高性能拷贝StringBuilder的可行方案
我们按你使用的.NET运行环境版本分两种实现方式,都不会产生中间不可变字符串,完全满足大数据量场景的性能要求:
1. .NET Core 2.1 / .NET Standard 2.1 / .NET 5及以上版本
你期望的写法已经被原生支持,直接使用即可:
StringBuilder newSB = new StringBuilder(oldSB);
底层实现直接拷贝原实例的内部字符缓冲区,无额外开销,性能最优。
2. .NET Framework 或低版本.NET Core
使用预分配容量+Append重载的方式实现:
// 先按原实例长度预分配容量,避免动态扩容损耗 StringBuilder newSB = new StringBuilder(oldSB.Length); // 直接追加原StringBuilder实例,不会生成中间字符串 newSB.Append(oldSB);
该方案的Append(StringBuilder)重载在.NET Framework 4.0及以上版本都支持,底层同样直接操作字符缓冲区,性能和原生构造函数基本持平。
不推荐的兼容方案
如果运行环境连Append(StringBuilder)重载都不支持,可以通过反射读取原StringBuilder的内部字符数组再写入新实例,但该方式依赖框架内部实现,兼容性差,非必要不要使用。
两种方案都比
oldSB.ToString()的写法少一次完整的内存拷贝,同时避免了大字符串对GC造成的额外压力,内容越大性能优势越明显。
内容的提问来源于stack exchange,提问作者NirMH
相关产品推荐
相关产品推荐

