• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package kotlinx.benchmarks.json
2 
3 import com.fasterxml.jackson.databind.DeserializationFeature
4 import com.fasterxml.jackson.databind.ObjectMapper
5 import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
6 import kotlinx.benchmarks.model.MacroTwitterFeed
7 import kotlinx.benchmarks.model.MicroTwitterFeed
8 import kotlinx.serialization.json.*
9 import org.openjdk.jmh.annotations.*
10 import java.io.*
11 import java.nio.file.Files
12 import java.nio.file.Path
13 import java.util.concurrent.TimeUnit
14 import kotlin.io.path.deleteIfExists
15 import kotlin.io.path.outputStream
16 
17 @Warmup(iterations = 7, time = 1)
18 @Measurement(iterations = 7, time = 1)
19 @BenchmarkMode(Mode.Throughput)
20 @OutputTimeUnit(TimeUnit.SECONDS)
21 @State(Scope.Benchmark)
22 @Fork(2)
23 open class TwitterFeedStreamBenchmark {
24     val resource = TwitterFeedBenchmark::class.java.getResource("/twitter_macro.json")!!
25     val bytes = resource.readBytes()
26     private val twitter = Json.decodeFromString(MacroTwitterFeed.serializer(), resource.readText())
27 
<lambda>null28     private val jsonIgnoreUnknwn = Json { ignoreUnknownKeys = true }
29     private val objectMapper: ObjectMapper =
30         jacksonObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
31 
32 
33     private val inputStream: InputStream
34         get() = ByteArrayInputStream(bytes)
35     private val outputStream: OutputStream
36         get() = ByteArrayOutputStream()
37 
38     @Benchmark
encodeTwitterWriteTextnull39     fun encodeTwitterWriteText(): OutputStream {
40         return outputStream.use {
41             it.bufferedWriter().write(Json.encodeToString(MacroTwitterFeed.serializer(), twitter))
42             it
43         }
44     }
45 
46     @Benchmark
encodeTwitterWriteStreamnull47     fun encodeTwitterWriteStream(): OutputStream {
48         return outputStream.use {
49             Json.encodeToStream(MacroTwitterFeed.serializer(), twitter, it)
50             it
51         }
52     }
53 
54     @Benchmark
encodeTwitterJacksonStreamnull55     fun encodeTwitterJacksonStream(): OutputStream {
56         return outputStream.use {
57             objectMapper.writeValue(it, twitter)
58             it
59         }
60     }
61 
62     @Benchmark
decodeMicroTwitterReadTextnull63     fun decodeMicroTwitterReadText(): MicroTwitterFeed {
64         return inputStream.use {
65             jsonIgnoreUnknwn.decodeFromString(MicroTwitterFeed.serializer(), it.bufferedReader().readText())
66         }
67     }
68 
69     @Benchmark
decodeMicroTwitterStreamnull70     fun decodeMicroTwitterStream(): MicroTwitterFeed {
71         return inputStream.use {
72             jsonIgnoreUnknwn.decodeFromStream(MicroTwitterFeed.serializer(), it.buffered())
73         }
74     }
75 
76     @Benchmark
decodeMicroTwitterJacksonStreamnull77     fun decodeMicroTwitterJacksonStream(): MicroTwitterFeed {
78         return inputStream.use {
79             objectMapper.readValue(it, MicroTwitterFeed::class.java)
80         }
81     }
82 }
83