• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package kotlinx.benchmarks.json
2 
3 import kotlinx.serialization.*
4 import kotlinx.serialization.json.*
5 import kotlinx.serialization.modules.*
6 import org.openjdk.jmh.annotations.*
7 import java.util.concurrent.*
8 
9 @Warmup(iterations = 7, time = 1)
10 @Measurement(iterations = 5, time = 1)
11 @BenchmarkMode(Mode.Throughput)
12 @OutputTimeUnit(TimeUnit.MILLISECONDS)
13 @State(Scope.Benchmark)
14 @Fork(1)
15 open class PolymorphismOverheadBenchmark {
16 
17     @Serializable
18     @JsonClassDiscriminator("poly")
19     data class PolymorphicWrapper(val i: @Polymorphic Poly, val i2: Impl) // amortize the cost a bit
20 
21     @Serializable
22     data class SimpleWrapper(val poly: @Polymorphic Poly)
23 
24     @Serializable
25     data class BaseWrapper(val i: Impl, val i2: Impl)
26 
27     @JsonClassDiscriminator("poly")
28     interface Poly
29 
30     @Serializable
31     @JsonClassDiscriminator("poly")
32     class Impl(val a: Int, val b: String) : Poly
33 
34     private val impl = Impl(239, "average_size_string")
<lambda>null35     private val module = SerializersModule {
36         polymorphic(Poly::class) {
37             subclass(Impl.serializer())
38         }
39     }
40 
<lambda>null41     private val json = Json { serializersModule = module }
42     private val implString = json.encodeToString(impl)
43     private val polyString = json.encodeToString<Poly>(impl)
44     private val serializer = serializer<Poly>()
45 
46     private val wrapper = SimpleWrapper(Impl(1, "abc"))
47     private val wrapperString = json.encodeToString(wrapper)
48     private val wrapperSerializer = serializer<SimpleWrapper>()
49 
50 
51     // 5000
52     @Benchmark
basenull53     fun base() = json.decodeFromString(Impl.serializer(), implString)
54 
55     // As of 1.3.x
56     // Baseline -- 1500
57     // v1, no skip -- 2000
58     // v2, with skip -- 3000 [withdrawn]
59     @Benchmark
60     fun poly() = json.decodeFromString(serializer, polyString)
61 
62     // test for child polymorphic serializer in decoding
63     @Benchmark
64     fun polyChildDecode() = json.decodeFromString(wrapperSerializer, wrapperString)
65 
66     // test for child polymorphic serializer in encoding
67     @Benchmark
68     fun polyChildEncode() = json.encodeToString(wrapperSerializer, wrapper)
69 
70 }
71