package main
import ( "bytes" "fmt" "strings" "testing" )
// 一:字节拼接 func BenchmarkStringOper(b *testing.B) { b.ResetTimer() bf := bytes.NewBufferString("") for i := 0; i < b.N; i++ { bf.WriteString("golang ") } }
// 二:字符串工具拼接 func BenchmarkStringOper2(b *testing.B) { b.ResetTimer() bf := strings.Builder{} for i := 0; i < b.N; i++ { bf.WriteString("golang ") } }
// 三:使用 fmt.Sprint 拼接 func BenchmarkStringOper3(b *testing.B) { b.ResetTimer() var s string for i := 0; i < b.N; i++ { s = fmt.Sprint(s, "golang ") } }
// 四:使用 + 号拼接 func BenchmarkStringOper4(b *testing.B) { b.ResetTimer() var s string for i := 0; i < b.N; i++ { s = s + "golang " } }
运行基准测试:go test -v -bench . -benchmem
goos: windows goarch: amd64 pkg: go_mods/src/handles/str cpu: Intel(R) Core(TM) i7-9700 CPU @ 3.00GHz BenchmarkStringOper BenchmarkStringOper-8 160907169 6.466 ns/op 16 B/op 0 allocs/op BenchmarkStringOper2 BenchmarkStringOper2-8 231565146 8.768 ns/op 41 B/op 0 allocs/op BenchmarkStringOper3 BenchmarkStringOper3-8 150400 144036 ns/op 1059633 B/op 4 allocs/op BenchmarkStringOper4 BenchmarkStringOper4-8 227385 111895 ns/op 799888 B/op 1 allocs/op PASS ok go_mods/src/handles/str 53.251s
ns/op 是完成一次迭代所需的大致时间 B/op 是内存分配的字节数 allocs/op 是内存交换次数 ns/op 、B/op 、allocs/op 数值都是越少越好
从基准测试可以看出:golang操作字符串拼接使用”一:字节拼接 bytes.NewBufferString("") “的方式是最高效的。