...
1 package jreader
2
3 import (
4 "encoding/json"
5 "testing"
6
7 "github.com/launchdarkly/go-jsonstream/v3/internal/commontest"
8 )
9
10
11
12
13
14 func BenchmarkJSONUnmarshalComparatives(b *testing.B) {
15 b.Run("Null", benchmarkReadNullJSONUnmarshal)
16 b.Run("Boolean", benchmarkReadBooleanJSONUnmarshal)
17 b.Run("NumberInt", benchmarkReadNumberIntJSONUnmarshal)
18 b.Run("NumberFloat", benchmarkReadNumberFloatJSONUnmarshal)
19 b.Run("String", benchmarkReadStringJSONUnmarshal)
20 b.Run("ArrayOfBools", benchmarkReadArrayOfBoolsJSONUnmarshal)
21 b.Run("ArrayOfStrings", benchmarkReadArrayOfStringsJSONUnmarshal)
22 b.Run("Object", benchmarkReadObjectJSONUnmarshal)
23 b.Run("ArrayOfObjects", benchmarkReadArrayOfObjectsJSONUnmarshal)
24 }
25
26 func benchmarkReadNullJSONUnmarshal(b *testing.B) {
27 data := []byte("null")
28 var expected interface{} = nil
29 b.ResetTimer()
30 for i := 0; i < b.N; i++ {
31 var val interface{}
32 if err := json.Unmarshal(data, &val); err != nil {
33 b.Error(err)
34 b.FailNow()
35 }
36 if val != expected {
37 b.FailNow()
38 }
39 }
40 }
41
42 func benchmarkReadBooleanJSONUnmarshal(b *testing.B) {
43 data := []byte("true")
44 expected := true
45 b.ResetTimer()
46 for i := 0; i < b.N; i++ {
47 var val bool
48 if err := json.Unmarshal(data, &val); err != nil {
49 b.Error(err)
50 b.FailNow()
51 }
52 if val != expected {
53 b.FailNow()
54 }
55 }
56 }
57
58 func benchmarkReadNumberIntJSONUnmarshal(b *testing.B) {
59 data := []byte("1234")
60 expected := 1234
61 b.ResetTimer()
62 for i := 0; i < b.N; i++ {
63 var val int
64 if err := json.Unmarshal(data, &val); err != nil {
65 b.Error(err)
66 b.FailNow()
67 }
68 if val != expected {
69 b.FailNow()
70 }
71 }
72 }
73
74 func benchmarkReadNumberFloatJSONUnmarshal(b *testing.B) {
75 data := []byte("1234.5")
76 expected := 1234.5
77 b.ResetTimer()
78 for i := 0; i < b.N; i++ {
79 var val float64
80 if err := json.Unmarshal(data, &val); err != nil {
81 b.Error(err)
82 b.FailNow()
83 }
84 if val != expected {
85 b.FailNow()
86 }
87 }
88 }
89
90 func benchmarkReadStringJSONUnmarshal(b *testing.B) {
91 data := []byte(`"abc"`)
92 expected := "abc"
93 b.ResetTimer()
94 for i := 0; i < b.N; i++ {
95 var val string
96 if err := json.Unmarshal(data, &val); err != nil {
97 b.Error(err)
98 b.FailNow()
99 }
100 if val != expected {
101 b.FailNow()
102 }
103 }
104 }
105
106 func benchmarkReadArrayOfBoolsJSONUnmarshal(b *testing.B) {
107 expected := commontest.MakeBools()
108 data := commontest.MakeBoolsJSON(expected)
109 b.ResetTimer()
110 for i := 0; i < b.N; i++ {
111 var vals []bool
112 if err := json.Unmarshal(data, &vals); err != nil {
113 b.Error(err)
114 b.FailNow()
115 }
116 if len(vals) < len(expected) {
117 b.FailNow()
118 }
119 }
120 }
121
122 func benchmarkReadArrayOfStringsJSONUnmarshal(b *testing.B) {
123 expected := commontest.MakeStrings()
124 data := commontest.MakeStringsJSON(expected)
125 b.ResetTimer()
126 for i := 0; i < b.N; i++ {
127 var vals []string
128 if err := json.Unmarshal(data, &vals); err != nil {
129 b.Error(err)
130 b.FailNow()
131 }
132 if len(vals) < len(expected) {
133 b.FailNow()
134 }
135 }
136 }
137
138 func benchmarkReadObjectJSONUnmarshal(b *testing.B) {
139 for i := 0; i < b.N; i++ {
140 var val ExampleStructWrapper
141 if err := json.Unmarshal(commontest.ExampleStructData, &val); err != nil {
142 b.Error(err)
143 b.FailNow()
144 }
145 if val != ExampleStructWrapper(commontest.ExampleStructValue) {
146 b.FailNow()
147 }
148 }
149 }
150
151 func benchmarkReadArrayOfObjectsJSONUnmarshal(b *testing.B) {
152 rawStructs := commontest.MakeStructs()
153 data := commontest.MakeStructsJSON(rawStructs)
154 var expected []ExampleStructWrapper
155 for _, rawStruct := range rawStructs {
156 expected = append(expected, ExampleStructWrapper(rawStruct))
157 }
158 b.ResetTimer()
159 for i := 0; i < b.N; i++ {
160 var values []ExampleStructWrapper
161 if err := json.Unmarshal(data, &values); err != nil {
162 b.Error(err)
163 b.FailNow()
164 }
165 for i, val := range values {
166 if val != expected[i] {
167 b.FailNow()
168 }
169 }
170 }
171 }
172
View as plain text