/
JacksonComparisonBenchmark.kt
119 lines (97 loc) · 4.76 KB
/
JacksonComparisonBenchmark.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package kotlinx.benchmarks.json
import com.fasterxml.jackson.databind.*
import com.fasterxml.jackson.module.kotlin.*
import kotlinx.serialization.*
import kotlinx.serialization.json.*
import kotlinx.serialization.json.okio.encodeToBufferedSink
import okio.blackholeSink
import okio.buffer
import org.openjdk.jmh.annotations.*
import java.io.OutputStream
import java.util.concurrent.*
@Warmup(iterations = 7, time = 1)
@Measurement(iterations = 5, time = 1)
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Benchmark)
@Fork(2)
open class JacksonComparisonBenchmark {
@Serializable
data class DefaultPixelEvent(
val version: Int,
val dateTime2: String,
val serverName: String,
val domain: String,
val method: String,
val clientIp: String,
val queryString: String,
val userAgent: String,
val contentType: String,
val browserLanguage: String,
val postData: String,
val cookies: String
)
private val objectMapper: ObjectMapper = jacksonObjectMapper()
private val data = DefaultPixelEvent(
version = 1,
dateTime2 = System.currentTimeMillis().toString(),
serverName = "some-endpoint-qwer",
domain = "some.domain.com",
method = "POST",
clientIp = "127.0.0.1",
queryString = "anxa=CASCative&anxv=13.901.16.34566&anxe=FoolbarActive&anxt=E7AFBF15-1761-4343-92C1-78167ED19B1C&anxtv=13.901.16.34566&anxp=%5ECQ6%5Expt292%5ES33656%5Eus&anxsi&anxd=2019-10-08T17%3A03%3A57.246Z&f=00400000&anxr=1571945992297&coid=66abafd0d49f42e58dc7536109395306&userSegment&cwsid=opgkcnbminncdgghighmimmphiooeohh",
userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0",
contentType = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
browserLanguage = "en-US,en;q=0.5",
postData = "-",
cookies = "_ga=GA1.2.971852807.1546968515"
)
private val dataWithEscapes = DefaultPixelEvent(
version = 1,
dateTime2 = System.currentTimeMillis().toString(),
serverName = "some-endp\"oint-qwer",
domain = "<a href=\"some.domain.com\">",
method = "POST",
clientIp = "127.0.0.1",
queryString = "anxa=CASCative&anxv=13.901.16.34566&anxe=\"FoolbarActive\"&anxt=E7AFBF15-1761-4343-92C1-78167ED19B1C&anxtv=13.901.16.34566&anxp=%5ECQ6%5Expt292%5ES33656%5Eus&anxsi&anxd=2019-10-08T17%3A03%3A57.246Z&f=00400000&anxr=1571945992297&coid=\"66abafd0d49f42e58dc7536109395306\"&userSegment&cwsid=opgkcnbminncdgghighmimmphiooeohh",
userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0",
contentType = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
browserLanguage = "\"en\"-\"US\",en;\\q=0.5",
postData = "-",
cookies = "_ga=GA1.2.971852807.1546968515"
)
private val devNullSink = blackholeSink().buffer()
private val devNullStream = object : OutputStream() {
override fun write(b: Int) {}
override fun write(b: ByteArray) {}
override fun write(b: ByteArray, off: Int, len: Int) {}
}
private val stringData = Json.encodeToString(DefaultPixelEvent.serializer(), data)
@Serializable
private class SmallDataClass(val id: Int, val name: String)
private val smallData = SmallDataClass(42, "Vincent")
@Benchmark
fun jacksonToString(): String = objectMapper.writeValueAsString(data)
@Benchmark
fun jacksonToStringWithEscapes(): String = objectMapper.writeValueAsString(dataWithEscapes)
@Benchmark
fun jacksonSmallToString(): String = objectMapper.writeValueAsString(smallData)
@Benchmark
fun kotlinToString(): String = Json.encodeToString(DefaultPixelEvent.serializer(), data)
@Benchmark
fun kotlinToStream() = Json.encodeToStream(DefaultPixelEvent.serializer(), data, devNullStream)
@Benchmark
fun kotlinToOkio() = Json.encodeToBufferedSink(DefaultPixelEvent.serializer(), data, devNullSink)
@Benchmark
fun kotlinToStringWithEscapes(): String = Json.encodeToString(DefaultPixelEvent.serializer(), dataWithEscapes)
@Benchmark
fun kotlinSmallToString(): String = Json.encodeToString(SmallDataClass.serializer(), smallData)
@Benchmark
fun kotlinSmallToStream() = Json.encodeToStream(SmallDataClass.serializer(), smallData, devNullStream)
@Benchmark
fun kotlinSmallToOkio() = Json.encodeToBufferedSink(SmallDataClass.serializer(), smallData, devNullSink)
@Benchmark
fun jacksonFromString(): DefaultPixelEvent = objectMapper.readValue(stringData, DefaultPixelEvent::class.java)
@Benchmark
fun kotlinFromString(): DefaultPixelEvent = Json.decodeFromString(DefaultPixelEvent.serializer(), stringData)
}