mirror of
https://github.com/redis/go-redis.git
synced 2025-12-02 06:22:31 +03:00
107 lines
2.0 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|