• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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