Skip to content

Instantly share code, notes, and snippets.

@suzujun
Last active August 26, 2022 12:49
Show Gist options
  • Save suzujun/a054617bbd5f2586478352430a4aad9a to your computer and use it in GitHub Desktop.
Save suzujun/a054617bbd5f2586478352430a4aad9a to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"math/rand"
"strings"
"testing"
"time"
)
func BenchmarkGenerateKey(b *testing.B) {
const str = "1234567890qwertyuiopasdfghjklzxcvbnm"
rand.Seed(time.Now().Unix())
pattern := make([]string, 100)
for i := range pattern {
end := rand.Intn(len(str) - 5)
pattern[i] = str[:end]
}
b.Run("strings.join", func(b *testing.B) {
for n := 0; n < b.N; n++ {
for i := 0; i < len(pattern)-2; i++ {
_ = strings.Join([]string{"",
pattern[i],
pattern[i+1],
pattern[i+2],
}, "/")
}
}
})
b.Run("string.Builder", func(b *testing.B) {
for n := 0; n < b.N; n++ {
for i := 0; i < len(pattern)-2; i++ {
var buf strings.Builder
buf.WriteString("/")
buf.WriteString(pattern[i])
buf.WriteString("/")
buf.WriteString(pattern[i+1])
buf.WriteString("/")
buf.WriteString(pattern[i+2])
_ = buf.String()
}
}
})
b.Run("string.Builder/grow", func(b *testing.B) {
for n := 0; n < b.N; n++ {
for i := 0; i < len(pattern)-2; i++ {
var buf strings.Builder
buf.Grow(len(pattern[i]) + len(pattern[i+1]) + len(pattern[i+2]) + 3)
buf.WriteString("/")
buf.WriteString(pattern[i])
buf.WriteString("/")
buf.WriteString(pattern[i+1])
buf.WriteString("/")
buf.WriteString(pattern[i+2])
_ = buf.String()
}
}
})
b.Run("fmt.Sprintf", func(b *testing.B) {
for n := 0; n < b.N; n++ {
for i := 0; i < len(pattern)-2; i++ {
_ = fmt.Sprintf("/%s/%s/%s", pattern[i], pattern[i+1], pattern[i+2])
}
}
})
}
@suzujun
Copy link
Author

suzujun commented Aug 26, 2022

Running tool: /usr/local/go/bin/go test -benchmem -run=^$ -bench ^BenchmarkGenerateKey$ ./

goos: darwin
goarch: amd64
pkg: github.com/WinTicket/server/pkg/tracer
cpu: Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz
BenchmarkGenerateKey/strings.join-16         	  161467	      7238 ns/op	    5472 B/op	      98 allocs/op
BenchmarkGenerateKey/string.Builder-16       	   91117	     12497 ns/op	   12120 B/op	     340 allocs/op
BenchmarkGenerateKey/string.Builder/grow-16  	  249152	      5373 ns/op	    5472 B/op	      98 allocs/op
BenchmarkGenerateKey/fmt.Sprintf-16          	   53454	     22245 ns/op	   10136 B/op	     389 allocs/op
PASS

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment