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("") “的方式是最高效的。