字符串拼接性能

最后更新于:2022-04-02 02:36:11

[TOC] > [参考](https://geektutu.com/post/hpg-string-concat.html) ## 对比 使用 + ``` func plusConcat(n int, str string) string { s := "" for i := 0; i < n; i++ { s += str } return s } ``` 使用 fmt.Sprintf ``` func sprintfConcat(n int, str string) string { s := "" for i := 0; i < n; i++ { s = fmt.Sprintf("%s%s", s, str) } return s } ``` 使用 strings.Builder ``` func builderConcat(n int, str string) string { var builder strings.Builder for i := 0; i < n; i++ { builder.WriteString(str) } return builder.String() } ``` 使用 bytes.Buffer ``` func bufferConcat(n int, s string) string { buf := new(bytes.Buffer) for i := 0; i < n; i++ { buf.WriteString(s) } return buf.String() } ``` 使用 []byte ``` func byteConcat(n int, str string) string { buf := make([]byte, 0) for i := 0; i < n; i++ { buf = append(buf, str...) } return string(buf) } ``` 定长 ``` func preByteConcat(n int, str string) string { buf := make([]byte, 0, n*len(str)) for i := 0; i < n; i++ { buf = append(buf, str...) } return string(buf) } ``` string.Builder 也提供了预分配内存的方式 Grow ``` func builderConcat(n int, str string) string { var builder strings.Builder builder.Grow(n * len(str)) for i := 0; i < n; i++ { builder.WriteString(str) } return builder.String() } ``` ## 性能对比 ``` BenchmarkPlusConcat-8 19 56 ms/op 530 MB/op 10026 allocs/op BenchmarkSprintfConcat-8 10 112 ms/op 835 MB/op 37435 allocs/op BenchmarkBuilderConcat-8 8901 0.13 ms/op 0.5 MB/op 23 allocs/op BenchmarkBufferConcat-8 8130 0.14 ms/op 0.4 MB/op 13 allocs/op BenchmarkByteConcat-8 8984 0.12 ms/op 0.6 MB/op 24 allocs/op BenchmarkPreByteConcat-8 17379 0.07 ms/op 0.2 MB/op 2 allocs/op BenchmarkBuilderConcat-8 16855 0.07 ns/op 0.1 MB/op 1 allocs/op ``` > 一般推荐使用`strings.Builder`来拼接字符串
';