reader_test.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package proto_test
  2. import (
  3. "bytes"
  4. "testing"
  5. "github.com/go-redis/redis/v7/internal/proto"
  6. )
  7. func BenchmarkReader_ParseReply_Status(b *testing.B) {
  8. benchmarkParseReply(b, "+OK\r\n", nil, false)
  9. }
  10. func BenchmarkReader_ParseReply_Int(b *testing.B) {
  11. benchmarkParseReply(b, ":1\r\n", nil, false)
  12. }
  13. func BenchmarkReader_ParseReply_Error(b *testing.B) {
  14. benchmarkParseReply(b, "-Error message\r\n", nil, true)
  15. }
  16. func BenchmarkReader_ParseReply_String(b *testing.B) {
  17. benchmarkParseReply(b, "$5\r\nhello\r\n", nil, false)
  18. }
  19. func BenchmarkReader_ParseReply_Slice(b *testing.B) {
  20. benchmarkParseReply(b, "*2\r\n$5\r\nhello\r\n$5\r\nworld\r\n", multiBulkParse, false)
  21. }
  22. func benchmarkParseReply(b *testing.B, reply string, m proto.MultiBulkParse, wanterr bool) {
  23. buf := new(bytes.Buffer)
  24. for i := 0; i < b.N; i++ {
  25. buf.WriteString(reply)
  26. }
  27. p := proto.NewReader(buf)
  28. b.ResetTimer()
  29. for i := 0; i < b.N; i++ {
  30. _, err := p.ReadReply(m)
  31. if !wanterr && err != nil {
  32. b.Fatal(err)
  33. }
  34. }
  35. }
  36. func multiBulkParse(p *proto.Reader, n int64) (interface{}, error) {
  37. vv := make([]interface{}, 0, n)
  38. for i := int64(0); i < n; i++ {
  39. v, err := p.ReadReply(multiBulkParse)
  40. if err != nil {
  41. return nil, err
  42. }
  43. vv = append(vv, v)
  44. }
  45. return vv, nil
  46. }