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