1 package kotlinx.benchmarks.json 2 3 import kotlinx.serialization.* 4 import kotlinx.serialization.json.* 5 import org.openjdk.jmh.annotations.* 6 import java.util.concurrent.* 7 8 9 @Suppress("unused", "BooleanLiteralArgument") 10 @Warmup(iterations = 5, time = 1) 11 @Measurement(iterations = 5, time = 1) 12 @BenchmarkMode(Mode.Throughput) 13 @OutputTimeUnit(TimeUnit.MICROSECONDS) 14 @State(Scope.Benchmark) 15 @Fork(1) 16 open class PrimitiveValuesBenchmark { 17 /* 18 * Stresses int/long and boolean parser. 19 * Order of magnitude: ~1.5 ops/us 20 */ 21 22 @Serializable 23 class BooleanHolder( 24 val b1: Boolean, val b2: Boolean, val b3: Boolean, val b4: Boolean, 25 val b5: Boolean, val b6: Boolean, val b7: Boolean, val b8: Boolean 26 ) 27 28 private val booleanHolder = BooleanHolder(true, false, true, false, true, true, false, false) 29 private val booleanValue = Json.encodeToString(booleanHolder) 30 31 @Serializable 32 class IntHolder( 33 val b1: Int, val b2: Int, val b3: Int, val b4: Int, 34 val b5: Int, val b6: Int, val b7: Int, val b8: Int 35 ) 36 37 private val intHolder = IntHolder(239, step(1), step(2), step(3), step(4), step(5), step(6), step(7)) 38 private val intValue = Json.encodeToString(intHolder) 39 stepnull40 private fun step(step: Int) = Int.MAX_VALUE / 8 * step 41 42 @Serializable 43 class LongHolder( 44 val b1: Long, val b2: Long, val b3: Long, val b4: Long, 45 val b5: Long, val b6: Long, val b7: Long, val b8: Long 46 ) 47 48 private val longHolder = LongHolder(239, step(1L), step(2L), step(3L), step(4L), step(5L), step(6L), step(7L)) 49 private val longValue = Json.encodeToString(longHolder) 50 51 private fun step(step: Long) = Long.MAX_VALUE / 8 * step 52 53 @Benchmark 54 fun decodeBoolean(): BooleanHolder = Json.decodeFromString(BooleanHolder.serializer(), booleanValue) 55 56 @Benchmark 57 fun decodeInt(): IntHolder = Json.decodeFromString(IntHolder.serializer(), intValue) 58 59 @Benchmark 60 fun decodeLong(): LongHolder = Json.decodeFromString(LongHolder.serializer(), longValue) 61 } 62