三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Go字符串高效拼接性能对比与底层原理分析

Go字符串高效拼接性能对比与底层原理分析

Go字符串高效拼接性能对比与底层原理分析

文章导语

Go中有多种字符串拼接方式:+fmt.Sprintfstrings.Joinstrings.Builderbytes.Buffer。在性能和可读性之间如何选择?本文通过Benchmark数据给出答案。

一、Benchmark对比

// 少量拼接(<10次):直接用+s:="a"+"b"+"c"// 编译器会自动优化为 "abc"// 循环拼接:用strings.Buildervarb strings.Builder b.Grow(estimated)// 预分配for_,s:=rangeitems{b.WriteString(s)}// 数组拼接:用strings.Joinstrings.Join(items,",")

二、性能数据

100次拼接: + 操作: 15000 ns/op, 10 allocations Builder: 1200 ns/op, 1 allocation Builder预分配: 600 ns/op, 1 allocation 结论:Builder比+快25倍,预分配再提速50%

三、底层原理

+每次创建新字符串(新的内存分配+拷贝)。Builder内部用[]byte,WriteString是append操作,String()时才转换一次。

四、全文总结

少量固定拼接用+,循环动态拼接用strings.Builder,数组拼接用strings.Join,预分配容量(Grow)提升性能。

参考文献

  1. Go strings.Builder文档
  2. Go Blog - Strings, bytes, runes
  3. Effective Go - Strings
← 返回列表