v2 / vlib / v / tests / bench / bench_compare_tokens.v
488 lines · 480 sloc · 9.82 KB · 8e35f4d9848f7ad35d857a187dddbfd2eca5e19d
Raw
1import v.token
2import benchmark
3
4const max_repetitions = 4_000_000
5
6fn main() {
7 mut res := token.Kind.unknown
8 km_trie := token.new_keywords_matcher_trie(token.keywords)
9 for kw in ['for', 'val', 'int', 'f32', 'struct', 'return', 'if', 'in', 'as', 'or', 'else',
10 'unsafe', 'return', 'assert', 'Abc', 'my_identifier', 'a', 'assez', 'returned'] {
11 mut bmark := benchmark.start()
12 for _ in 0 .. max_repetitions {
13 res = token.keywords[kw]
14 }
15 bmark.measure('${max_repetitions} repetitions of token.keywords["${kw}"] = ${res}')
16
17 for _ in 0 .. max_repetitions {
18 res = unsafe { token.Kind(km_trie.find(kw)) }
19 }
20 bmark.measure('${max_repetitions} repetitions of km_trie.find("${kw}") = ${res}')
21
22 for _ in 0 .. max_repetitions {
23 res = from_string(kw)
24 }
25 bmark.measure('${max_repetitions} repetitions of from_string("${kw}") = ${res}')
26
27 println('--------------------------------')
28 }
29}
30
31@[direct_array_access]
32fn from_string(name string) token.Kind {
33 match name.len {
34 2 {
35 match name[0] {
36 `a` {
37 match name[1] {
38 `s` { return .key_as }
39 else { return .unknown }
40 }
41 }
42 `f` {
43 match name[1] {
44 `n` { return .key_fn }
45 else { return .unknown }
46 }
47 }
48 `g` {
49 match name[1] {
50 `o` { return .key_go }
51 else { return .unknown }
52 }
53 }
54 `i` {
55 match name[1] {
56 `f` { return .key_if }
57 `n` { return .key_in }
58 `s` { return .key_is }
59 else { return .unknown }
60 }
61 }
62 `o` {
63 match name[1] {
64 `r` { return .key_orelse }
65 else { return .unknown }
66 }
67 }
68 else {
69 return .unknown
70 }
71 }
72
73 return .unknown
74 }
75 3 {
76 match name[0] {
77 `a` {
78 if name[1] == `s` && name[2] == `m` {
79 return .key_asm
80 } else {
81 return .unknown
82 }
83 }
84 `f` {
85 if name[1] == `o` && name[2] == `r` {
86 return .key_for
87 } else {
88 return .unknown
89 }
90 }
91 `m` {
92 if name[1] == `u` && name[2] == `t` {
93 return .key_mut
94 } else {
95 return .unknown
96 }
97 }
98 `n` {
99 if name[1] == `i` && name[2] == `l` {
100 return .key_nil
101 } else {
102 return .unknown
103 }
104 }
105 `p` {
106 if name[1] == `u` && name[2] == `b` {
107 return .key_pub
108 } else {
109 return .unknown
110 }
111 }
112 else {
113 return .unknown
114 }
115 }
116
117 return .unknown
118 }
119 4 {
120 match name[0] {
121 `d` {
122 if name[1] == `u` && name[2] == `m` && name[3] == `p` {
123 return .key_dump
124 } else {
125 return .unknown
126 }
127 }
128 `e` {
129 match name[1] {
130 `l` {
131 if name[2] == `s` && name[3] == `e` {
132 return .key_else
133 } else {
134 return .unknown
135 }
136 }
137 `n` {
138 if name[2] == `u` && name[3] == `m` {
139 return .key_enum
140 } else {
141 return .unknown
142 }
143 }
144 else {
145 return .unknown
146 }
147 }
148 }
149 `g` {
150 if name[1] == `o` && name[2] == `t` && name[3] == `o` {
151 return .key_goto
152 } else {
153 return .unknown
154 }
155 }
156 `l` {
157 if name[1] == `o` && name[2] == `c` && name[3] == `k` {
158 return .key_lock
159 } else {
160 return .unknown
161 }
162 }
163 `n` {
164 if name[1] == `o` && name[2] == `n` && name[3] == `e` {
165 return .key_none
166 } else {
167 return .unknown
168 }
169 }
170 `t` {
171 match name[1] {
172 `r` {
173 if name[2] == `u` && name[3] == `e` {
174 return .key_true
175 } else {
176 return .unknown
177 }
178 }
179 `y` {
180 if name[2] == `p` && name[3] == `e` {
181 return .key_type
182 } else {
183 return .unknown
184 }
185 }
186 else {
187 return .unknown
188 }
189 }
190 }
191 else {
192 return .unknown
193 }
194 }
195 }
196 5 {
197 match name[0] {
198 `b` {
199 if name[1] == `r` && name[2] == `e` && name[3] == `a` && name[4] == `k` {
200 return .key_break
201 } else {
202 return .unknown
203 }
204 }
205 `c` {
206 if name[1] == `o` && name[2] == `n` && name[3] == `s` && name[4] == `t` {
207 return .key_const
208 } else {
209 return .unknown
210 }
211 }
212 `d` {
213 if name[1] == `e` && name[2] == `f` && name[3] == `e` && name[4] == `r` {
214 return .key_defer
215 } else {
216 return .unknown
217 }
218 }
219 `f` {
220 if name[1] == `a` && name[2] == `l` && name[3] == `s` && name[4] == `e` {
221 return .key_false
222 } else {
223 return .unknown
224 }
225 }
226 `m` {
227 if name[1] == `a` && name[2] == `t` && name[3] == `c` && name[4] == `h` {
228 return .key_match
229 } else {
230 return .unknown
231 }
232 }
233 `r` {
234 if name[1] == `l` && name[2] == `o` && name[3] == `c` && name[4] == `k` {
235 return .key_rlock
236 } else {
237 return .unknown
238 }
239 }
240 `s` {
241 if name[1] == `p` && name[2] == `a` && name[3] == `w` && name[4] == `n` {
242 return .key_spawn
243 } else {
244 return .unknown
245 }
246 }
247 `u` {
248 if name[1] == `n` && name[2] == `i` && name[3] == `o` && name[4] == `n` {
249 return .key_union
250 } else {
251 return .unknown
252 }
253 }
254 else {
255 return .unknown
256 }
257 }
258 }
259 6 {
260 match name[0] {
261 `a` {
262 match name[1] {
263 `s` {
264 if name[2] == `s` && name[3] == `e` && name[4] == `r` && name[5] == `t` {
265 return .key_assert
266 } else {
267 return .unknown
268 }
269 }
270 `t` {
271 if name[2] == `o` && name[3] == `m` && name[4] == `i` && name[5] == `c` {
272 return .key_atomic
273 } else {
274 return .unknown
275 }
276 }
277 else {
278 return .unknown
279 }
280 }
281 }
282 `i` {
283 if name[1] == `m` && name[2] == `p` && name[3] == `o` && name[4] == `r`
284 && name[5] == `t` {
285 return .key_import
286 } else {
287 return .unknown
288 }
289 }
290 `m` {
291 if name[1] == `o` && name[2] == `d` && name[3] == `u` && name[4] == `l`
292 && name[5] == `e` {
293 return .key_module
294 } else {
295 return .unknown
296 }
297 }
298 `r` {
299 if name[1] == `e` && name[2] == `t` && name[3] == `u` && name[4] == `r`
300 && name[5] == `n` {
301 return .key_return
302 } else {
303 return .unknown
304 }
305 }
306 `s` {
307 match name[1] {
308 `e` {
309 if name[2] == `l` && name[3] == `e` && name[4] == `c` && name[5] == `t` {
310 return .key_select
311 } else {
312 return .unknown
313 }
314 }
315 `h` {
316 if name[2] == `a` && name[3] == `r` && name[4] == `e` && name[5] == `d` {
317 return .key_shared
318 } else {
319 return .unknown
320 }
321 }
322 `i` {
323 if name[2] == `z` && name[3] == `e` && name[4] == `o` && name[5] == `f` {
324 return .key_sizeof
325 } else {
326 return .unknown
327 }
328 }
329 `t` {
330 match name[2] {
331 `a` {
332 if name[3] == `t` && name[4] == `i` && name[5] == `c` {
333 return .key_static
334 } else {
335 return .unknown
336 }
337 }
338 `r` {
339 if name[3] == `u` && name[4] == `c` && name[5] == `t` {
340 return .key_struct
341 } else {
342 return .unknown
343 }
344 }
345 else {
346 return .unknown
347 }
348 }
349 }
350 else {
351 return .unknown
352 }
353 }
354 }
355 `t` {
356 if name[1] == `y` && name[2] == `p` && name[3] == `e` && name[4] == `o`
357 && name[5] == `f` {
358 return .key_typeof
359 } else {
360 return .unknown
361 }
362 }
363 `u` {
364 if name[1] == `n` && name[2] == `s` && name[3] == `a` && name[4] == `f`
365 && name[5] == `e` {
366 return .key_unsafe
367 } else {
368 return .unknown
369 }
370 }
371 else {
372 return .unknown
373 }
374 }
375 }
376 8 {
377 match name[0] {
378 `_` {
379 match name[1] {
380 `_` {
381 if name[2] == `g` && name[3] == `l` && name[4] == `o` && name[5] == `b`
382 && name[6] == `a` && name[7] == `l` {
383 return .key_global
384 } else {
385 return .unknown
386 }
387 }
388 `l` {
389 if name[2] == `i` && name[3] == `k` && name[4] == `e` && name[5] == `l`
390 && name[6] == `y` && name[7] == `_` {
391 return .key_likely
392 } else {
393 return .unknown
394 }
395 }
396 else {
397 return .unknown
398 }
399 }
400 }
401 `c` {
402 if name[1] == `o` && name[2] == `n` && name[3] == `t` && name[4] == `i`
403 && name[5] == `n` && name[6] == `u` && name[7] == `e` {
404 return .key_continue
405 } else {
406 return .unknown
407 }
408 }
409 `v` {
410 if name[1] == `o` && name[2] == `l` && name[3] == `a` && name[4] == `t`
411 && name[5] == `i` && name[6] == `l` && name[7] == `e` {
412 return .key_volatile
413 } else {
414 return .unknown
415 }
416 }
417 else {
418 return .unknown
419 }
420 }
421 }
422 9 {
423 match name[0] {
424 `i` {
425 match name[1] {
426 `n` {
427 if name[2] == `t` && name[3] == `e` && name[4] == `r` && name[5] == `f`
428 && name[6] == `a` && name[7] == `c` && name[8] == `e` {
429 return .key_interface
430 } else {
431 return .unknown
432 }
433 }
434 `s` {
435 if name[2] == `r` && name[3] == `e` && name[4] == `f` && name[5] == `t`
436 && name[6] == `y` && name[7] == `p` && name[8] == `e` {
437 return .key_isreftype
438 } else {
439 return .unknown
440 }
441 }
442 else {
443 return .unknown
444 }
445 }
446 }
447 else {
448 return .unknown
449 }
450 }
451 }
452 10 {
453 match name[0] {
454 `_` {
455 match name[1] {
456 `_` {
457 if name[2] == `o` && name[3] == `f` && name[4] == `f` && name[5] == `s`
458 && name[6] == `e` && name[7] == `t` && name[8] == `o`
459 && name[9] == `f` {
460 return .key_offsetof
461 } else {
462 return .unknown
463 }
464 }
465 `u` {
466 if name[2] == `n` && name[3] == `l` && name[4] == `i` && name[5] == `k`
467 && name[6] == `e` && name[7] == `l` && name[8] == `y`
468 && name[9] == `_` {
469 return .key_unlikely
470 } else {
471 return .unknown
472 }
473 }
474 else {
475 return .unknown
476 }
477 }
478 }
479 else {
480 return .unknown
481 }
482 }
483 }
484 else {
485 return .unknown
486 }
487 }
488}
489