summaryrefslogtreecommitdiff
path: root/benchmark/src/jmh/kotlin/kotlinx/benchmarks/json/LookupOverheadBenchmark.kt
blob: ddfc57922a4d4d4a1ef9d50cd88d388e133dd40e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*
 * Copyright 2017-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
 */

package kotlinx.benchmarks.json

import kotlinx.serialization.*
import kotlinx.serialization.builtins.*
import kotlinx.serialization.json.*
import org.openjdk.jmh.annotations.*
import java.util.concurrent.*

@Warmup(iterations = 7, time = 1)
@Measurement(iterations = 7, time = 1)
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Benchmark)
@Fork(2)
open class LookupOverheadBenchmark {

    @Serializable
    class Holder(val a: String)

    @Serializable
    class Generic<T>(val a: T)

    @Serializable
    class DoubleGeneric<T1, T2>(val a: T1, val b: T2)

    @Serializable
    class PentaGeneric<T1, T2, T3, T4, T5>(val a: T1, val b: T2, val c: T3, val d: T4, val e: T5)

    private val data = """{"a":""}"""
    private val doubleData = """{"a":"","b":0}"""
    private val pentaData = """{"a":"","b":0,"c":1,"d":true,"e":" "}"""

    @Serializable
    object Object

    @Benchmark
    fun dataReified() = Json.decodeFromString<Holder>(data)

    @Benchmark
    fun dataPlain() = Json.decodeFromString(Holder.serializer(), data)

    @Benchmark
    fun genericReified() = Json.decodeFromString<Generic<String>>(data)

    @Benchmark
    fun genericPlain() = Json.decodeFromString(Generic.serializer(String.serializer()), data)

    @Benchmark
    fun doubleGenericReified() = Json.decodeFromString<DoubleGeneric<String, Int>>(doubleData)

    @Benchmark
    fun doubleGenericPlain() = Json.decodeFromString(DoubleGeneric.serializer(String.serializer(), Int.serializer()), doubleData)

    @Benchmark
    fun pentaGenericReified() = Json.decodeFromString<PentaGeneric<String, Int, Long, Boolean, Char>>(pentaData)

    @Benchmark
    fun pentaGenericPlain() = Json.decodeFromString(PentaGeneric.serializer(String.serializer(), Int.serializer(), Long.serializer(), Boolean.serializer(), Char.serializer()), pentaData)

    @Benchmark
    fun objectReified() = Json.decodeFromString<Object>("{}")

    @Benchmark
    fun objectPlain() = Json.decodeFromString(Object.serializer(), "{}")
}