• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package kotlinx.benchmarks.json
2 
3 import com.fasterxml.jackson.databind.*
4 import com.fasterxml.jackson.module.kotlin.*
5 import benchmarks.model.*
6 import kotlinx.serialization.*
7 import kotlinx.serialization.json.*
8 import kotlinx.serialization.json.okio.encodeToBufferedSink
9 import okio.blackholeSink
10 import okio.buffer
11 import org.openjdk.jmh.annotations.*
12 import java.io.ByteArrayInputStream
13 import java.io.OutputStream
14 import java.util.concurrent.*
15 
16 @Warmup(iterations = 7, time = 1)
17 @Measurement(iterations = 5, time = 1)
18 @BenchmarkMode(Mode.Throughput)
19 @OutputTimeUnit(TimeUnit.MILLISECONDS)
20 @State(Scope.Benchmark)
21 @Fork(2)
22 open class JacksonComparisonBenchmark {
23 
24     private val objectMapper: ObjectMapper = jacksonObjectMapper()
25 
26 
27     private val devNullSink = blackholeSink().buffer()
28     private val devNullStream = object : OutputStream() {
writenull29         override fun write(b: Int) {}
writenull30         override fun write(b: ByteArray) {}
writenull31         override fun write(b: ByteArray, off: Int, len: Int) {}
32     }
33 
34     private val stringData = Json.encodeToString(DefaultPixelEvent.serializer(), pixelEvent)
35     private val utf8BytesData = stringData.toByteArray()
36 
37     @Serializable
38     private class SmallDataClass(val id: Int, val name: String)
39 
40     private val smallData = SmallDataClass(42, "Vincent")
41 
42     @Benchmark
jacksonToStringnull43     fun jacksonToString(): String = objectMapper.writeValueAsString(pixelEvent)
44 
45     @Benchmark
46     fun jacksonToStringWithEscapes(): String = objectMapper.writeValueAsString(pixelEventWithEscapes)
47 
48     @Benchmark
49     fun jacksonSmallToString(): String = objectMapper.writeValueAsString(smallData)
50 
51     @Benchmark
52     fun kotlinToString(): String = Json.encodeToString(DefaultPixelEvent.serializer(), pixelEvent)
53 
54     @Benchmark
55     fun kotlinToStream() = Json.encodeToStream(DefaultPixelEvent.serializer(), pixelEvent, devNullStream)
56 
57     @Benchmark
58     fun kotlinFromStream() = Json.decodeFromStream(DefaultPixelEvent.serializer(), ByteArrayInputStream(utf8BytesData))
59 
60     @Benchmark
61     fun kotlinToOkio() = Json.encodeToBufferedSink(DefaultPixelEvent.serializer(), pixelEvent, devNullSink)
62 
63     @Benchmark
64     fun kotlinToStringWithEscapes(): String = Json.encodeToString(DefaultPixelEvent.serializer(), pixelEventWithEscapes)
65 
66     @Benchmark
67     fun kotlinSmallToString(): String = Json.encodeToString(SmallDataClass.serializer(), smallData)
68 
69     @Benchmark
70     fun kotlinSmallToStream() = Json.encodeToStream(SmallDataClass.serializer(), smallData, devNullStream)
71 
72     @Benchmark
73     fun kotlinSmallToOkio() = Json.encodeToBufferedSink(SmallDataClass.serializer(), smallData, devNullSink)
74 
75     @Benchmark
76     fun jacksonFromString(): DefaultPixelEvent = objectMapper.readValue(stringData, DefaultPixelEvent::class.java)
77 
78     @Benchmark
79     fun kotlinFromString(): DefaultPixelEvent = Json.decodeFromString(DefaultPixelEvent.serializer(), stringData)
80 }
81