Go语言如何高效的进行字符串拼接(6种方式进行对比分析) 2024-01-26 默认分类 暂无评论 485 次阅读 本文讨论多个大字符串拼接时的性能对比 想看结论直接跳到文末即可: 大量字符串拼接的测试我们先构建一个长度为200的字符串切片: ``` var baseSlice []string for i := 0; i < 200; i++ { baseSlice = append(baseSlice, base) } ``` 然后遍历这个切片不断的进行拼接,因为可以得出benchmark: ``` goos: darwin goarch: amd64 pkg: asong.cloud/Golang_Dream/code_demo/string_join/muliti cpu: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz BenchmarkSumString-16 7396 163612 ns/op 1277713 B/op 199 allocs/op BenchmarkSprintfString-16 5946 202230 ns/op 1288552 B/op 600 allocs/op BenchmarkBuilderString-16 262525 4638 ns/op 40960 B/op 1 allocs/op BenchmarkBytesBufferString-16 183492 6568 ns/op 44736 B/op 9 allocs/op BenchmarkJoinstring-16 398923 3035 ns/op 12288 B/op 1 allocs/op BenchmarkByteSliceString-16 144554 8205 ns/op 60736 B/op 15 allocs/op PASS ok asong.cloud/Golang_Dream/code_demo/string_join/muliti 10.699s ``` 通过两次benchmark对比,我们可以看到当进行少量字符串拼接时, 直接使用`+操作符`进行拼接字符串,效率还是挺高的,但是当要拼接的字符串数量上来时, +操作符的性能就比较低了; fmt.Sprintf 函数`fmt.Sprintf`还是不适合进行字符串拼接,无论拼接字符串数量多少, 性能损耗都很大,还是老老实实做他的字符串格式化就好了; strings.Builder `strings.Builder`无论是少量字符串的拼接还是大量的字符串拼接, 性能一直都能稳定,这也是为什么Go语言官方推荐使用`strings.builder`进行字符串拼接的原因, 在使用`strings.builder`时最好使用Grow方法进行初步的容量分配, strings.join 观察`strings.join`方法的benchmark就可以发现,因为使用了grow方法,提前分配好内存, 在字符串拼接的过程中,不需要进行字符串的拷贝,也不需要分配新的内存, 这样使用strings.builder性能最好,且内存消耗最小。 bytes.Buffer `bytes.Buffer`方法性能是低于`strings.builder`的,bytes.Buffer 转化为字符串时重新申请了一块空间, 存放生成的字符串变量,不像`strings.buidler`这样直接将底层的 []byte 转换成了字符串类型返回, 这就占用了更多的空间。 同步最后分析的结论: > 1. 无论什么情况下使用strings.builder进行字符串拼接都是最高效的,不过要主要使用方法,记得调用grow进行容量分配,才会高效。 > 2. strings.join的性能约等于strings.builder,在已经字符串slice的时候可以使用,未知时不建议使用,构造切片也是有性能损耗的; > 3. 如果进行少量的字符串拼接时,直接使用+操作符是最方便也是性能最高的,可以放弃strings.builder的使用。 综合对比性能排序: strings.join ≈ strings.builder > bytes.buffer > []byte转换string > "+" > fmt.sprintf 总结 ``` 本文我们针对6种字符串的拼接方式进行介绍, 并通过benckmark对比了效率,无论什么时候使用strings.builder都不会错, 但是在少量字符串拼接时,直接+也就是更优的方式,具体业务场景具体分析,不要一概而论。 ``` 文中代码已上传github:https://github.com/asong2020/... ![](https://i-cooltea.top/usr/uploads/2024/01/1850338540.png)[转自: Go语言如何高效的进行字符串拼接(6种方式进行对比分析)](https://segmentfault.com/a/1190000040999541 "Go语言如何高效的进行字符串拼接(6种方式进行对比分析)") 文章目录 fmt.Sprintf strings.Builder strings.join bytes.Buffer 同步最后分析的结论: 总结 标签: golang 转载请注明文章来源 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭