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