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