summaryrefslogtreecommitdiff
path: root/benchmark/src/jmh/kotlin/kotlinx/benchmarks/json/PolymorphismOverheadBenchmark.kt
blob: 9af856d33faa51724e6cd6daf92df8797efdae24 (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
70
package kotlinx.benchmarks.json

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

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

    @Serializable
    @JsonClassDiscriminator("poly")
    data class PolymorphicWrapper(val i: @Polymorphic Poly, val i2: Impl) // amortize the cost a bit

    @Serializable
    data class SimpleWrapper(val poly: @Polymorphic Poly)

    @Serializable
    data class BaseWrapper(val i: Impl, val i2: Impl)

    @JsonClassDiscriminator("poly")
    interface Poly

    @Serializable
    @JsonClassDiscriminator("poly")
    class Impl(val a: Int, val b: String) : Poly

    private val impl = Impl(239, "average_size_string")
    private val module = SerializersModule {
        polymorphic(Poly::class) {
            subclass(Impl.serializer())
        }
    }

    private val json = Json { serializersModule = module }
    private val implString = json.encodeToString(impl)
    private val polyString = json.encodeToString<Poly>(impl)
    private val serializer = serializer<Poly>()

    private val wrapper = SimpleWrapper(Impl(1, "abc"))
    private val wrapperString = json.encodeToString(wrapper)
    private val wrapperSerializer = serializer<SimpleWrapper>()


    // 5000
    @Benchmark
    fun base() = json.decodeFromString(Impl.serializer(), implString)

    // As of 1.3.x
    // Baseline -- 1500
    // v1, no skip -- 2000
    // v2, with skip -- 3000 [withdrawn]
    @Benchmark
    fun poly() = json.decodeFromString(serializer, polyString)

    // test for child polymorphic serializer in decoding
    @Benchmark
    fun polyChildDecode() = json.decodeFromString(wrapperSerializer, wrapperString)

    // test for child polymorphic serializer in encoding
    @Benchmark
    fun polyChildEncode() = json.encodeToString(wrapperSerializer, wrapper)

}