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