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