1 package kotlinx.benchmarks.json 2 3 import kotlinx.benchmarks.model.* 4 import kotlinx.serialization.json.* 5 import org.openjdk.jmh.annotations.* 6 import java.io.OutputStream 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(2) 15 open class TwitterBenchmark { 16 17 /* 18 * Twitter feed benchmark. 19 * 20 * This is a small piece of twitter feed taken from one of the simdjson repository 21 * with Kotlin classes generated by Json2Kotlin plugin (and also manually adjusted) 22 */ 23 private val input = TwitterBenchmark::class.java.getResource("/twitter.json").readBytes().decodeToString() 24 private val twitter = Json.decodeFromString(Twitter.serializer(), input) 25 <lambda>null26 private val jsonImplicitNulls = Json { explicitNulls = false } 27 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 @Setup initnull35 fun init() { 36 require(twitter == Json.decodeFromString(Twitter.serializer(), Json.encodeToString(Twitter.serializer(), twitter))) 37 } 38 39 // Order of magnitude: 4-7 op/ms 40 @Benchmark decodeTwitternull41 fun decodeTwitter() = Json.decodeFromString(Twitter.serializer(), input) 42 43 @Benchmark 44 fun decodeTwitterImplicitNulls() = jsonImplicitNulls.decodeFromString(Twitter.serializer(), input) 45 46 @Benchmark 47 fun encodeTwitter() = Json.encodeToString(Twitter.serializer(), twitter) 48 49 @Benchmark 50 fun encodeTwitterStream() = Json.encodeToStream(Twitter.serializer(), twitter, devNullStream) 51 } 52