Golang中哪种字符串连接最高效

Golang字符串连接

字符串连接在用任何语言开发时都是一个最常用的操作,在Golang中也不例外,比如最常用的写日志场景。这个看似简单的操作,因为其操作的频繁性,如果忽略其性能问题的话也是对我们的程序有相当大的影响的。

字符串连接的性能测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package concat_string

import (
"bytes"
"fmt"
"strconv"
"strings"
"testing"
)

const numbers = 100

func BenchmarkSprintf(b *testing.B) {
b.ResetTimer()
for idx := 0; idx < b.N; idx++ {
var s string
for i := 0; i < numbers; i++ {
s = fmt.Sprintf("%v%v", s, i)
}
}
b.StopTimer()
}

func BenchmarkStringBuilder(b *testing.B) {
b.ResetTimer()
for idx := 0; idx < b.N; idx++ {
var builder strings.Builder
for i := 0; i < numbers; i++ {
builder.WriteString(strconv.Itoa(i))

}
_ = builder.String()
}
b.StopTimer()
}

func BenchmarkBytesBuf(b *testing.B) {
b.ResetTimer()
for idx := 0; idx < b.N; idx++ {
var buf bytes.Buffer
for i := 0; i < numbers; i++ {
buf.WriteString(strconv.Itoa(i))
}
_ = buf.String()
}
b.StopTimer()
}

func BenchmarkStringAdd(b *testing.B) {
b.ResetTimer()
for idx := 0; idx < b.N; idx++ {
var s string
for i := 0; i < numbers; i++ {
s += strconv.Itoa(i)
}

}
b.StopTimer()
}

性能测试结果

结论

可以看到string.builder的性能最好,bytes.buffer次之,然后是+号连接,最差的就是Sprintf。

所以面对字符串连接这样的高频操作,我们最好就是选择string.builder的方式连接字符串,当然这个要求你的Golang版本大于1.10,如果版本不满足的话也可以选择性能相差最小的bytes.buffer的方式。

加载评论框需要科学上网