Skip to content

Instantly share code, notes, and snippets.

@derekperkins
Created May 14, 2024 21:16
Show Gist options
  • Save derekperkins/8328b93a3c34ebc89893b06a1fcb5aba to your computer and use it in GitHub Desktop.
Save derekperkins/8328b93a3c34ebc89893b06a1fcb5aba to your computer and use it in GitHub Desktop.
Benchmarking string

Benchmarked on 2024-05-14 on a 2023 M3 Max MacBook Pro 36 GB, Go 1.22.3

BenchmarkStringConcat
BenchmarkStringConcat-14             	31729719	        36.95 ns/op	      16 B/op	       2 allocs/op
BenchmarkStringBuilder
BenchmarkStringBuilder-14            	44426755	        26.44 ns/op	      24 B/op	       2 allocs/op
BenchmarkStringBuilderFromPool
BenchmarkStringBuilderFromPool-14    	35302768	        33.49 ns/op	      24 B/op	       2 allocs/op
BenchmarkBytesBuffer
BenchmarkBytesBuffer-14              	32597475	        36.08 ns/op	      80 B/op	       2 allocs/op
BenchmarkBytesBufferFromPool
BenchmarkBytesBufferFromPool-14      	46955626	        25.51 ns/op	      16 B/op	       1 allocs/op
package sqlargbench
import (
"bytes"
"strings"
"sync"
"testing"
)
var builderPool = sync.Pool{
New: func() any {
return &strings.Builder{}
},
}
var bufferPool = sync.Pool{
New: func() any {
return &bytes.Buffer{}
},
}
func BenchmarkStringConcat(b *testing.B) {
b.ReportAllocs()
for i := 0; i < b.N; i++ {
useStringConcat()
}
}
func BenchmarkStringBuilder(b *testing.B) {
b.ReportAllocs()
for i := 0; i < b.N; i++ {
useStringBuilder()
}
}
func BenchmarkStringBuilderFromPool(b *testing.B) {
b.ReportAllocs()
for i := 0; i < b.N; i++ {
useStringBuilderFromPool()
}
}
func BenchmarkBytesBuffer(b *testing.B) {
b.ReportAllocs()
for i := 0; i < b.N; i++ {
useBytesBuffer()
}
}
func BenchmarkBytesBufferFromPool(b *testing.B) {
b.ReportAllocs()
for i := 0; i < b.N; i++ {
useBytesBufferFromPool()
}
}
func useStringConcat() string {
var s string
s += "foo"
s += "bar"
s += "car"
return s
}
func useStringBuilder() string {
var sb strings.Builder
sb.WriteString("foo")
sb.WriteString("bar")
sb.WriteString("car")
return sb.String()
}
func useStringBuilderFromPool() string {
sb := builderPool.Get().(*strings.Builder)
defer func() {
sb.Reset()
builderPool.Put(sb)
}()
sb.WriteString("foo")
sb.WriteString("bar")
sb.WriteString("car")
return sb.String()
}
func useBytesBuffer() string {
var buf bytes.Buffer
buf.WriteString("foo")
buf.WriteString("bar")
buf.WriteString("car")
return buf.String()
}
func useBytesBufferFromPool() string {
buf := bufferPool.Get().(*bytes.Buffer)
defer func() {
buf.Reset()
bufferPool.Put(buf)
}()
buf.WriteString("foo")
buf.WriteString("bar")
buf.WriteString("car")
return buf.String()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment