v2 / vlib / x / json2 / tests / bench.v
213 lines · 151 sloc · 5.17 KB · 8342968516549ff965df1ef231a9d35632c4fcac
Raw
1import x.json2
2import json as old_json
3import benchmark
4import time
5
6// ./v wipe-cache && ./v -prod -cc gcc crun vlib/x/json2/tests/bench.v
7const max_iterations = 1_000_000
8// const max_iterations = 10 // trying figure out it is slower in small loop. I guess it is `fulfill_nodes` related. Any suggestion?
9
10pub struct Stru {
11 val int
12 val2 string
13 val3 Stru2
14}
15
16pub struct Stru2 {
17 a int
18 churrasco string
19}
20
21type SumTypes = Stru | bool | int | string | time.Time
22type StringAlias = string
23type IntAlias = int
24
25enum Enum {
26 a
27 b
28 c
29 d
30 e = 99
31 f
32}
33
34struct StructType[T] {
35mut:
36 val T
37}
38
39struct StructTypeOption[T] {
40mut:
41 val ?T
42}
43
44struct StructTypePointer[T] {
45mut:
46 val &T
47}
48
49fn main() {
50 json_data := '{"_type": "Stru", "val": 1, "val2": "lala", "val3": {"a": 2, "churrasco": "leleu"}}'
51 json_data1 := '{"val": "2"}'
52 json_data2 := '{"val": 2}'
53
54 println('Starting benchmark...')
55 println('max_iterations: ${max_iterations}')
56 println('\n***Structure and maps***')
57
58 mut b := benchmark.start()
59
60 // Stru **********************************************************
61
62 for i := 0; i < max_iterations; i++ {
63 _ := json2.decode[Stru](json_data)!
64 }
65
66 b.measure('json2.decode[Stru](json_data)!')
67
68 for i := 0; i < max_iterations; i++ {
69 _ := old_json.decode(Stru, json_data)!
70 }
71
72 b.measure('old_json.decode(Stru, json_data)!\n')
73
74 for i := 0; i < max_iterations; i++ {
75 _ := json2.decode[SumTypes](json_data)!
76 }
77
78 b.measure('json2.decode[SumTypes](json_data)!')
79
80 for i := 0; i < max_iterations; i++ {
81 _ := old_json.decode(SumTypes, json_data)!
82 }
83
84 b.measure('old_json.decode(SumTypes, json_data)!\n')
85
86 // StructType[string] **********************************************************
87 for i := 0; i < max_iterations; i++ {
88 _ := json2.decode[StructType[string]](json_data1)!
89 }
90
91 b.measure('json2.decode[StructType[string]](json_data1)!')
92
93 for i := 0; i < max_iterations; i++ {
94 _ := old_json.decode(StructType[string], json_data1)!
95 }
96
97 b.measure('old_json.decode(StructType[string], json_data1)!\n')
98
99 // StructTypeOption[string] **********************************************************
100 for i := 0; i < max_iterations; i++ {
101 _ := json2.decode[StructTypeOption[string]](json_data1)!
102 }
103
104 b.measure('json2.decode[StructTypeOption[string]](json_data1)!')
105
106 for i := 0; i < max_iterations; i++ {
107 _ := old_json.decode(StructTypeOption[string], json_data1)!
108 }
109
110 b.measure('old_json.decode(StructTypeOption[string], json_data1)!\n')
111
112 // StructType[int] **********************************************************
113 for i := 0; i < max_iterations; i++ {
114 _ := json2.decode[StructType[int]](json_data2)!
115 }
116
117 b.measure('json2.decode[StructType[int]](json_data2)!')
118
119 for i := 0; i < max_iterations; i++ {
120 _ := old_json.decode(StructType[int], json_data2)!
121 }
122
123 b.measure('old_json.decode(StructType[int], json_data2)!\n')
124
125 // map[string]string **********************************************************
126 for i := 0; i < max_iterations; i++ {
127 _ := json2.decode[map[string]string](json_data1)!
128 }
129
130 b.measure('json2.decode[map[string]string](json_data1)!')
131
132 for i := 0; i < max_iterations; i++ {
133 _ := old_json.decode(map[string]string, json_data1)!
134 }
135
136 b.measure('old_json.decode(map[string]string, json_data1)!\n')
137
138 // array **********************************************************
139
140 println('\n***arrays***')
141
142 for i := 0; i < max_iterations; i++ {
143 _ := json2.decode[[]int]('[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]')!
144 }
145
146 b.measure("json2.decode[[]int]('[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]')!")
147
148 for i := 0; i < max_iterations; i++ {
149 _ := old_json.decode([]int, '[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]')!
150 }
151
152 b.measure("old_json.decode([]int, '[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]')!\n")
153
154 println('\n***simple types***')
155
156 // int **********************************************************
157 for i := 0; i < max_iterations; i++ {
158 _ := json2.decode[int]('2')!
159 }
160
161 b.measure("json2.decode[int]('2')!")
162
163 // bool **********************************************************
164 for i := 0; i < max_iterations; i++ {
165 _ := json2.decode[bool]('true')!
166 }
167
168 b.measure("json2.decode[bool]('true')!")
169
170 // time.Time **********************************************************
171 for i := 0; i < max_iterations; i++ {
172 _ := json2.decode[time.Time]('"2022-03-11T13:54:25"')!
173 }
174
175 b.measure("json2.decode[time.Time]('2022-03-11T13:54:25')!")
176
177 // string **********************************************************
178 for i := 0; i < max_iterations; i++ {
179 _ := json2.decode[string]('"abcdefghijklimnopqrstuv"')!
180 }
181
182 b.measure('json2.decode[string](\'"abcdefghijklimnopqrstuv"\')!')
183
184 // alias **********************************************************
185
186 println('\n***alias***')
187
188 for i := 0; i < max_iterations; i++ {
189 _ := json2.decode[IntAlias]('2')!
190 }
191
192 b.measure('json2.decode[IntAlias](2)!')
193
194 for i := 0; i < max_iterations; i++ {
195 _ := json2.decode[StringAlias]('"abcdefghijklimnopqrstuv"')!
196 }
197
198 b.measure('json2.decode[StringAlias](\'"abcdefghijklimnopqrstuv"\')!')
199
200 println('\n***Sumtypes***')
201
202 for i := 0; i < max_iterations; i++ {
203 _ := json2.decode[SumTypes]('2')!
204 }
205
206 b.measure('json2.decode[SumTypes](2)!')
207
208 for i := 0; i < max_iterations; i++ {
209 _ := json2.decode[SumTypes]('"abcdefghijklimnopqrstuv"')!
210 }
211
212 b.measure('json2.decode[SumTypes](\'"abcdefghijklimnopqrstuv"\')!')
213}
214