...
1 package jreader
2
3 import (
4 "testing"
5
6 "github.com/launchdarkly/go-jsonstream/v3/internal/commontest"
7 )
8
9 func BenchmarkReadNullNoAlloc(b *testing.B) {
10 data := []byte("null")
11 b.ResetTimer()
12 for i := 0; i < b.N; i++ {
13 r := NewReader(data)
14 if err := r.Null(); err != nil {
15 b.FailNow()
16 }
17 }
18 }
19
20 func BenchmarkReadBooleanNoAlloc(b *testing.B) {
21 data := []byte("true")
22 b.ResetTimer()
23 for i := 0; i < b.N; i++ {
24 r := NewReader(data)
25 val := r.Bool()
26 if !val || r.Error() != nil {
27 b.FailNow()
28 }
29 }
30 }
31
32 func BenchmarkReadNumberIntNoAlloc(b *testing.B) {
33 data := []byte("1234")
34 b.ResetTimer()
35 for i := 0; i < b.N; i++ {
36 r := NewReader(data)
37 val := r.Int()
38 failBenchmarkOnReaderError(b, &r)
39 if val != 1234 {
40 b.FailNow()
41 }
42 }
43 }
44
45 func BenchmarkReadNumberFloat(b *testing.B) {
46 data := []byte("1234.5")
47 b.ResetTimer()
48 for i := 0; i < b.N; i++ {
49 r := NewReader(data)
50 val := r.Float64()
51 failBenchmarkOnReaderError(b, &r)
52 if val != 1234.5 {
53 b.FailNow()
54 }
55 }
56 }
57
58 func BenchmarkReadString(b *testing.B) {
59 data := []byte(`"abc"`)
60 b.ResetTimer()
61 for i := 0; i < b.N; i++ {
62 r := NewReader(data)
63 val := r.String()
64 failBenchmarkOnReaderError(b, &r)
65 if val != "abc" {
66 b.FailNow()
67 }
68 }
69 }
70
71 func BenchmarkReadArrayOfBools(b *testing.B) {
72 expected := commontest.MakeBools()
73 data := commontest.MakeBoolsJSON(expected)
74 b.ResetTimer()
75 for i := 0; i < b.N; i++ {
76 var vals []bool
77 r := NewReader(data)
78 arr := r.Array()
79 failBenchmarkOnReaderError(b, &r)
80 for arr.Next() {
81 val := r.Bool()
82 failBenchmarkOnReaderError(b, &r)
83 vals = append(vals, val)
84 }
85 if len(vals) < len(expected) {
86 b.FailNow()
87 }
88 }
89 }
90
91 func BenchmarkReadArrayOfStrings(b *testing.B) {
92 expected := commontest.MakeStrings()
93 data := commontest.MakeStringsJSON(expected)
94 b.ResetTimer()
95 for i := 0; i < b.N; i++ {
96 var vals []string
97 r := NewReader(data)
98 arr := r.Array()
99 failBenchmarkOnReaderError(b, &r)
100 for arr.Next() {
101 val := r.String()
102 failBenchmarkOnReaderError(b, &r)
103 vals = append(vals, val)
104 }
105 if len(vals) < len(expected) {
106 b.FailNow()
107 }
108 }
109 }
110
111 func BenchmarkReadArrayOfNullsNoAlloc(b *testing.B) {
112
113 data := []byte(`[null,null]`)
114 b.ResetTimer()
115 for i := 0; i < b.N; i++ {
116 r := NewReader(data)
117 arr := r.Array()
118 failBenchmarkOnReaderError(b, &r)
119 if !arr.Next() {
120 b.FailNow()
121 }
122 if err := r.Null(); err != nil {
123 b.FailNow()
124 }
125 if !arr.Next() {
126 b.FailNow()
127 }
128 failBenchmarkOnReaderError(b, &r)
129 if arr.Next() {
130 b.FailNow()
131 }
132 }
133 }
134
135 func BenchmarkReadObjectNoAlloc(b *testing.B) {
136 for i := 0; i < b.N; i++ {
137 var val ExampleStructWrapper
138 r := NewReader(commontest.ExampleStructData)
139 val.ReadFromJSONReader(&r)
140 failBenchmarkOnReaderError(b, &r)
141 if val != ExampleStructWrapper(commontest.ExampleStructValue) {
142 b.FailNow()
143 }
144 }
145 }
146
147 func BenchmarkReadArrayOfObjects(b *testing.B) {
148 rawStructs := commontest.MakeStructs()
149 data := commontest.MakeStructsJSON(rawStructs)
150 var expected []ExampleStructWrapper
151 for _, rawStruct := range rawStructs {
152 expected = append(expected, ExampleStructWrapper(rawStruct))
153 }
154 b.ResetTimer()
155 for i := 0; i < b.N; i++ {
156 values := make([]ExampleStructWrapper, 0)
157 r := NewReader(data)
158 for arr := r.Array(); arr.Next(); {
159 var val ExampleStructWrapper
160 val.ReadFromJSONReader(&r)
161 values = append(values, val)
162 }
163 failBenchmarkOnReaderError(b, &r)
164 for i, val := range values {
165 if val != expected[i] {
166 b.FailNow()
167 }
168 }
169 }
170 }
171
172 func BenchmarkReadObjectWithRequiredPropsNoAlloc(b *testing.B) {
173 for i := 0; i < b.N; i++ {
174 var val ExampleStructWrapperWithRequiredProps
175 r := NewReader(commontest.ExampleStructData)
176 val.ReadFromJSONReader(&r)
177 failBenchmarkOnReaderError(b, &r)
178 if val != ExampleStructWrapperWithRequiredProps(commontest.ExampleStructValue) {
179 b.FailNow()
180 }
181 }
182 }
183
184 func failBenchmarkOnReaderError(b *testing.B, r *Reader) {
185 if r.Error() != nil {
186 b.Error(r.Error())
187 b.FailNow()
188 }
189 }
190
View as plain text