v/vlib/x/json2/decoder2/tests/bench.v
2024-10-30 09:01:39 +02:00

214 lines
5.3 KiB
V

import x.json2.decoder2
import json as old_json
import benchmark
import time
// ./v -prod crun vlib/x/json/tests/c.v
// ./v wipe-cache && ./v -prod -cc gcc crun vlib/x/json2/decoder2/tests/bench.v
const max_iterations = 1_000_000
// const max_iterations = 10 // trying figure out it is slower in small loop. I guess it is `fulfill_nodes` related. Any suggestion?
pub struct Stru {
val int
val2 string
val3 Stru2
}
pub struct Stru2 {
a int
churrasco string
}
type SumTypes = Stru | bool | int | string | time.Time
type StringAlias = string
type IntAlias = int
enum Enum {
a
b
c
d
e = 99
f
}
struct StructType[T] {
mut:
val T
}
struct StructTypeOption[T] {
mut:
val ?T
}
struct StructTypePointer[T] {
mut:
val &T
}
fn main() {
json_data := '{"_type": "Stru", "val": 1, "val2": "lala", "val3": {"a": 2, "churrasco": "leleu"}}'
json_data1 := '{"val": "2"}'
json_data2 := '{"val": 2}'
println('Starting benchmark...')
println('max_iterations: ${max_iterations}')
println('\n***Structure and maps***')
mut b := benchmark.start()
// Stru **********************************************************
for i := 0; i < max_iterations; i++ {
_ := decoder2.decode[Stru](json_data)!
}
b.measure('decoder2.decode[Stru](json_data)!')
for i := 0; i < max_iterations; i++ {
_ := old_json.decode(Stru, json_data)!
}
b.measure('old_json.decode(Stru, json_data)!\n')
for i := 0; i < max_iterations; i++ {
_ := decoder2.decode[SumTypes](json_data)!
}
b.measure('decoder2.decode[SumTypes](json_data)!')
for i := 0; i < max_iterations; i++ {
_ := old_json.decode(SumTypes, json_data)!
}
b.measure('old_json.decode(SumTypes, json_data)!\n')
// StructType[string] **********************************************************
for i := 0; i < max_iterations; i++ {
_ := decoder2.decode[StructType[string]](json_data1)!
}
b.measure('decoder2.decode[StructType[string]](json_data1)!')
for i := 0; i < max_iterations; i++ {
_ := old_json.decode(StructType[string], json_data1)!
}
b.measure('old_json.decode(StructType[string], json_data1)!\n')
// StructTypeOption[string] **********************************************************
for i := 0; i < max_iterations; i++ {
_ := decoder2.decode[StructTypeOption[string]](json_data1)!
}
b.measure('decoder2.decode[StructTypeOption[string]](json_data1)!')
for i := 0; i < max_iterations; i++ {
_ := old_json.decode(StructTypeOption[string], json_data1)!
}
b.measure('old_json.decode(StructTypeOption[string], json_data1)!\n')
// StructType[int] **********************************************************
for i := 0; i < max_iterations; i++ {
_ := decoder2.decode[StructType[int]](json_data2)!
}
b.measure('decoder2.decode[StructType[int]](json_data2)!')
for i := 0; i < max_iterations; i++ {
_ := old_json.decode(StructType[int], json_data2)!
}
b.measure('old_json.decode(StructType[int], json_data2)!\n')
// map[string]string **********************************************************
for i := 0; i < max_iterations; i++ {
_ := decoder2.decode[map[string]string](json_data1)!
}
b.measure('decoder2.decode[map[string]string](json_data1)!')
for i := 0; i < max_iterations; i++ {
_ := old_json.decode(map[string]string, json_data1)!
}
b.measure('old_json.decode(map[string]string, json_data1)!\n')
// array **********************************************************
println('\n***arrays***')
for i := 0; i < max_iterations; i++ {
_ := decoder2.decode[[]int]('[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]')!
}
b.measure("decoder2.decode[[]int]('[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]')!")
for i := 0; i < max_iterations; i++ {
_ := old_json.decode([]int, '[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]')!
}
b.measure("old_json.decode([]int, '[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]')!\n")
println('\n***simple types***')
// int **********************************************************
for i := 0; i < max_iterations; i++ {
_ := decoder2.decode[int]('2')!
}
b.measure("decoder2.decode[int]('2')!")
// bool **********************************************************
for i := 0; i < max_iterations; i++ {
_ := decoder2.decode[bool]('true')!
}
b.measure("decoder2.decode[bool]('true')!")
// time.Time **********************************************************
for i := 0; i < max_iterations; i++ {
_ := decoder2.decode[time.Time]('"2022-03-11T13:54:25"')!
}
b.measure("decoder2.decode[time.Time]('2022-03-11T13:54:25')!")
// string **********************************************************
for i := 0; i < max_iterations; i++ {
_ := decoder2.decode[string]('"abcdefghijklimnopqrstuv"')!
}
b.measure('decoder2.decode[string](\'"abcdefghijklimnopqrstuv"\')!')
// alias **********************************************************
println('\n***alias***')
for i := 0; i < max_iterations; i++ {
_ := decoder2.decode[IntAlias]('2')!
}
b.measure('decoder2.decode[IntAlias](2)!')
for i := 0; i < max_iterations; i++ {
_ := decoder2.decode[StringAlias]('"abcdefghijklimnopqrstuv"')!
}
b.measure('decoder2.decode[StringAlias](\'"abcdefghijklimnopqrstuv"\')!')
println('\n***Sumtypes***')
for i := 0; i < max_iterations; i++ {
_ := decoder2.decode[SumTypes]('2')!
}
b.measure('decoder2.decode[SumTypes](2)!')
for i := 0; i < max_iterations; i++ {
_ := decoder2.decode[SumTypes]('"abcdefghijklimnopqrstuv"')!
}
b.measure('decoder2.decode[SumTypes](\'"abcdefghijklimnopqrstuv"\')!')
}