func BenchmarkStringsJoin(b *testing.B) {
testData := []string{"adf", "123", ";;fg,.", "saf", "zfj", "78dfg", "124567890876543", "astyuiobvfd", "zxca", "dgjkkjhgfd"}
b.Run("concatstrings", func(b *testing.B) {
for i := 0; i < b.N; i++ {
concatstrings(testData)
}
})
b.Run("strings.Builder", func(b *testing.B) {
for i := 0; i < b.N; i++ {
strBuilder(testData)
}
})
b.Run("strings.Builder.Grow", func(b *testing.B) {
for i := 0; i < b.N; i++ {
strBuilderGrow(testData)
}
})
b.Run("strings.Join", func(b *testing.B) {
for i := 0; i < b.N; i++ {
Join(testData)
}
})
}
func concatstrings(sl []string) string {
var ret string
for i := 0; i < len(sl); i++ {
ret += sl[i]
}
return ret
}
func strBuilder(sl []string) string {
var ret strings.Builder
for i := 0; i < len(sl); i++ {
ret.WriteString(sl[i])
}
return ret.String()
}
func strBuilderGrow(sl []string) string {
var n int
for _, s := range sl {
n += len(s)
}
var ret strings.Builder
ret.Grow(n)
for i := 0; i < len(sl); i++ {
ret.WriteString(sl[i])
}
return ret.String()
}
func Join(sl []string) string {
return strings.Join(sl, "")
}
其中使用直接 + 是最慢的也是最耗费内存的,使用strings.Builder能大幅提升性能。综合来看直接使用strings.Join方法是非常不错的。