1
0
mirror of https://github.com/redis/go-redis.git synced 2025-12-03 18:31:14 +03:00
Files
go-redis/internal/proto/writer_bench_test.go
Nedyalko Dyakov f672885808 wip
2025-10-31 13:04:46 +02:00

107 lines
2.0 KiB
Go

package proto
import (
"bytes"
"testing"
)
// BenchmarkWriteArgs benchmarks writing command arguments
func BenchmarkWriteArgs(b *testing.B) {
testCases := []struct {
name string
args []interface{}
}{
{
name: "simple_get",
args: []interface{}{"GET", "key"},
},
{
name: "simple_set",
args: []interface{}{"SET", "key", "value"},
},
{
name: "set_with_expiry",
args: []interface{}{"SET", "key", "value", "EX", 3600},
},
{
name: "zadd",
args: []interface{}{"ZADD", "myset", 1.0, "member1", 2.0, "member2", 3.0, "member3"},
},
{
name: "large_command",
args: make([]interface{}, 100),
},
}
// Initialize large command
for i := range testCases[len(testCases)-1].args {
testCases[len(testCases)-1].args[i] = "arg"
}
for _, tc := range testCases {
b.Run(tc.name, func(b *testing.B) {
buf := &bytes.Buffer{}
wr := NewWriter(buf)
b.ResetTimer()
b.ReportAllocs()
for i := 0; i < b.N; i++ {
buf.Reset()
if err := wr.WriteArgs(tc.args); err != nil {
b.Fatal(err)
}
}
})
}
}
// BenchmarkWriteArgsParallel benchmarks concurrent writes
func BenchmarkWriteArgsParallel(b *testing.B) {
args := []interface{}{"SET", "key", "value", "EX", 3600}
b.ReportAllocs()
b.RunParallel(func(pb *testing.PB) {
buf := &bytes.Buffer{}
wr := NewWriter(buf)
for pb.Next() {
buf.Reset()
if err := wr.WriteArgs(args); err != nil {
b.Fatal(err)
}
}
})
}
// BenchmarkWriteCmds benchmarks writing multiple commands (pipeline)
func BenchmarkWriteCmds(b *testing.B) {
sizes := []int{1, 10, 50, 100, 500}
for _, size := range sizes {
b.Run(string(rune('0'+size/10)), func(b *testing.B) {
// Create commands
cmds := make([][]interface{}, size)
for i := range cmds {
cmds[i] = []interface{}{"SET", "key", i}
}
buf := &bytes.Buffer{}
wr := NewWriter(buf)
b.ResetTimer()
b.ReportAllocs()
for i := 0; i < b.N; i++ {
buf.Reset()
for _, args := range cmds {
if err := wr.WriteArgs(args); err != nil {
b.Fatal(err)
}
}
}
})
}
}