• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package kotlinx.benchmarks.json
2 
3 import kotlinx.serialization.*
4 import kotlinx.serialization.descriptors.SerialDescriptor
5 import kotlinx.serialization.descriptors.buildClassSerialDescriptor
6 import kotlinx.serialization.descriptors.element
7 import kotlinx.serialization.encoding.*
8 import kotlinx.serialization.json.*
9 import kotlinx.serialization.modules.*
10 import org.openjdk.jmh.annotations.*
11 import java.util.concurrent.*
12 
13 @Warmup(iterations = 7, time = 1)
14 @Measurement(iterations = 5, time = 1)
15 @BenchmarkMode(Mode.Throughput)
16 @OutputTimeUnit(TimeUnit.MILLISECONDS)
17 @State(Scope.Benchmark)
18 @Fork(1)
19 open class ContextualOverheadBenchmark {
20     @Serializable
21     data class Holder(val data: @Contextual Data)
22 
23     class Data(val a: Int, val b: String)
24 
25     object DataSerializer: KSerializer<Data> {
<lambda>null26         override val descriptor: SerialDescriptor = buildClassSerialDescriptor("Serializer") {
27             element<Int>("a")
28             element<String>("b")
29         }
30 
deserializenull31         override fun deserialize(decoder: Decoder): Data {
32             return decoder.decodeStructure(descriptor) {
33                 var a = 0
34                 var b = ""
35                 while (true) {
36                     when (val index = decodeElementIndex(descriptor)) {
37                         0 -> a = decodeIntElement(descriptor, 0)
38                         1 -> b = decodeStringElement(descriptor, 1)
39                         CompositeDecoder.DECODE_DONE -> break
40                         else -> error("Unexpected index: $index")
41                     }
42                 }
43                 Data(a, b)
44             }
45         }
46 
serializenull47         override fun serialize(encoder: Encoder, value: Data) {
48             encoder.encodeStructure(descriptor) {
49                 encodeIntElement(descriptor, 0, value.a)
50                 encodeStringElement(descriptor, 1, value.b)
51             }
52         }
53 
54     }
55 
<lambda>null56     private val module = SerializersModule {
57         contextual(DataSerializer)
58     }
59 
<lambda>null60     private val json = Json { serializersModule = module }
61 
62     private val holder = Holder(Data(1, "abc"))
63     private val holderString = json.encodeToString(holder)
64     private val holderSerializer = serializer<Holder>()
65 
66     @Benchmark
decodenull67     fun decode() = json.decodeFromString(holderSerializer, holderString)
68 
69     @Benchmark
70     fun encode() = json.encodeToString(holderSerializer, holder)
71 
72 }
73