summaryrefslogtreecommitdiff
path: root/benchmark/src/jmh/kotlin/kotlinx/benchmarks/json/JacksonComparisonBenchmark.kt
blob: b812500145651dc7fbd68e02089d64612848a772 (plain)
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
package kotlinx.benchmarks.json

import com.fasterxml.jackson.databind.*
import com.fasterxml.jackson.module.kotlin.*
import kotlinx.serialization.*
import kotlinx.serialization.json.*
import org.openjdk.jmh.annotations.*
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 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 kotlinToStringWithEscapes(): String = Json.encodeToString(DefaultPixelEvent.serializer(), dataWithEscapes)

    @Benchmark
    fun kotlinSmallToString(): String = Json.encodeToString(SmallDataClass.serializer(), smallData)

    @Benchmark
    fun jacksonFromString(): DefaultPixelEvent = objectMapper.readValue(stringData, DefaultPixelEvent::class.java)

    @Benchmark
    fun kotlinFromString(): DefaultPixelEvent = Json.decodeFromString(DefaultPixelEvent.serializer(), stringData)
}