1 package kotlinx.benchmarks.json 2 3 import kotlinx.serialization.Serializable 4 import kotlinx.serialization.decodeFromString 5 import kotlinx.serialization.encodeToString 6 import kotlinx.serialization.json.Json 7 import org.openjdk.jmh.annotations.* 8 import java.util.concurrent.TimeUnit 9 10 @Warmup(iterations = 5, time = 1) 11 @Measurement(iterations = 5, time = 1) 12 @BenchmarkMode(Mode.Throughput) 13 @OutputTimeUnit(TimeUnit.MILLISECONDS) 14 @State(Scope.Benchmark) 15 @Fork(2) 16 open class ImplicitNullsBenchmark { 17 18 @Serializable 19 data class Values( 20 val field0: Int?, 21 val field1: Int?, 22 val field2: Int?, 23 val field3: Int?, 24 val field4: Int?, 25 val field5: Int?, 26 val field6: Int?, 27 val field7: Int?, 28 val field8: Int?, 29 val field9: Int?, 30 31 val field10: Int?, 32 val field11: Int?, 33 val field12: Int?, 34 val field13: Int?, 35 val field14: Int?, 36 val field15: Int?, 37 val field16: Int?, 38 val field17: Int?, 39 val field18: Int?, 40 val field19: Int?, 41 42 val field20: Int?, 43 val field21: Int?, 44 val field22: Int?, 45 val field23: Int?, 46 val field24: Int?, 47 val field25: Int?, 48 val field26: Int?, 49 val field27: Int?, 50 val field28: Int?, 51 val field29: Int?, 52 53 val field30: Int?, 54 val field31: Int? 55 ) 56 57 <lambda>null58 private val jsonImplicitNulls = Json { explicitNulls = false } 59 60 private val valueWithNulls = Values( 61 null, null, 2, null, null, null, null, null, null, null, 62 null, null, null, null, 14, null, null, null, null, null, 63 null, null, null, null, null, null, null, null, null, null, 64 null, null 65 ) 66 67 68 private val jsonWithNulls = """{"field0":null,"field1":null,"field2":2,"field3":null,"field4":null,"field5":null, 69 |"field6":null,"field7":null,"field8":null,"field9":null,"field10":null,"field11":null,"field12":null, 70 |"field13":null,"field14":14,"field15":null,"field16":null,"field17":null,"field18":null,"field19":null, 71 |"field20":null,"field21":null,"field22":null,"field23":null,"field24":null,"field25":null,"field26":null, 72 |"field27":null,"field28":null,"field29":null,"field30":null,"field31":null}""".trimMargin() 73 74 private val jsonNoNulls = """{"field0":0,"field1":1,"field2":2,"field3":3,"field4":4,"field5":5, 75 |"field6":6,"field7":7,"field8":8,"field9":9,"field10":10,"field11":11,"field12":12, 76 |"field13":13,"field14":14,"field15":15,"field16":16,"field17":17,"field18":18,"field19":19, 77 |"field20":20,"field21":21,"field22":22,"field23":23,"field24":24,"field25":25,"field26":26, 78 |"field27":27,"field28":28,"field29":29,"field30":30,"field31":31}""".trimMargin() 79 80 private val jsonWithAbsence = """{"field2":2, "field14":14}""" 81 82 private val serializer = Values.serializer() 83 84 @Benchmark decodeNoNullsnull85 fun decodeNoNulls() { 86 Json.decodeFromString(serializer, jsonNoNulls) 87 } 88 89 @Benchmark decodeNoNullsImplicitnull90 fun decodeNoNullsImplicit() { 91 jsonImplicitNulls.decodeFromString(serializer, jsonNoNulls) 92 } 93 94 @Benchmark decodeNullsnull95 fun decodeNulls() { 96 Json.decodeFromString(serializer, jsonWithNulls) 97 } 98 99 @Benchmark decodeNullsImplicitnull100 fun decodeNullsImplicit() { 101 jsonImplicitNulls.decodeFromString(serializer, jsonWithNulls) 102 } 103 104 @Benchmark decodeAbsenceImplicitnull105 fun decodeAbsenceImplicit() { 106 jsonImplicitNulls.decodeFromString(serializer, jsonWithAbsence) 107 } 108 109 @Benchmark encodeNullsnull110 fun encodeNulls() { 111 Json.encodeToString(serializer, valueWithNulls) 112 } 113 114 @Benchmark encodeNullsImplicitnull115 fun encodeNullsImplicit() { 116 jsonImplicitNulls.encodeToString(serializer, valueWithNulls) 117 } 118 } 119