Created
September 18, 2017 19:23
-
-
Save damien5314/4cf3c4f87ecc6fd56b1a3235e3f658c4 to your computer and use it in GitHub Desktop.
Jackson performance testing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.quizlet.perf | |
import com.fasterxml.jackson.databind.ObjectMapper | |
import com.quizlet.android.logging.ConsoleLogger | |
import com.quizlet.android.logging.ConsoleLoggingTree | |
import org.junit.After | |
import org.junit.Before | |
import org.junit.Test | |
import timber.log.Timber | |
class JacksonTests { | |
@Before | |
fun setUp() { | |
Timber.plant(ConsoleLoggingTree(ConsoleLogger())) | |
} | |
@After | |
fun tearDown() { | |
Timber.uprootAll() | |
} | |
@Test | |
fun objectMapper_create() { | |
val tracker = PerfTracker().get("objectMapper") | |
val iterations = 100000 | |
for (i in 1..iterations) { | |
tracker.measure { | |
// Just creating an object | |
val mapper = ObjectMapper() | |
} | |
} | |
Timber.d("iterations: $iterations") | |
Timber.d("total (ns): ${tracker.totalTimeNs}") | |
Timber.d("ns/iterations: ${tracker.timePerIterationNs}") | |
} | |
@Test | |
fun objectReader_create_noCache() { | |
val tracker = PerfTracker().get("objectReader") | |
val iterations = 20 | |
for (i in 1..iterations) { | |
val mapper = ObjectMapper() | |
tracker.measure { | |
val start = System.nanoTime() | |
val reader = mapper.readerFor(RandomData::class.java) | |
val duration = System.nanoTime() - start | |
Timber.d("iteration took $duration ns") | |
} | |
} | |
Timber.d("iterations: $iterations") | |
Timber.d("total (ns): ${tracker.totalTimeNs}") | |
Timber.d("ns/iterations: ${tracker.timePerIterationNs}") | |
} | |
@Test | |
fun objectReader_create_cache() { | |
val tracker = PerfTracker().get("objectReader") | |
val iterations = 20 | |
val mapper = ObjectMapper() | |
for (i in 1..iterations) { | |
tracker.measure { | |
val start = System.nanoTime() | |
val reader = mapper.readerFor(RandomData::class.java) | |
val duration = System.nanoTime() - start | |
Timber.d("iteration took $duration ns") | |
} | |
} | |
Timber.d("iterations: $iterations") | |
Timber.d("total (ns): ${tracker.totalTimeNs}") | |
Timber.d("ns/iterations: ${tracker.timePerIterationNs}") | |
} | |
@Test | |
fun objectWriter_create_noCache() { | |
val tracker = PerfTracker().get("objectWriter") | |
val iterations = 20 | |
for (i in 1..iterations) { | |
val mapper = ObjectMapper() | |
tracker.measure { | |
val start = System.nanoTime() | |
val writer = mapper.writerFor(RandomData::class.java) | |
val duration = System.nanoTime() - start | |
Timber.d("iteration took $duration ns") | |
} | |
} | |
Timber.d("iterations: $iterations") | |
Timber.d("total (ns): ${tracker.totalTimeNs}") | |
Timber.d("ns/iterations: ${tracker.timePerIterationNs}") | |
} | |
@Test | |
fun objectWriter_create_cache() { | |
val tracker = PerfTracker().get("objectWriter") | |
val iterations = 20 | |
val mapper = ObjectMapper() | |
for (i in 1..iterations) { | |
tracker.measure { | |
val start = System.nanoTime() | |
val writer = mapper.writerFor(RandomData::class.java) | |
val duration = System.nanoTime() - start | |
Timber.d("iteration took $duration ns") | |
} | |
} | |
Timber.d("iterations: $iterations") | |
Timber.d("total (ns): ${tracker.totalTimeNs}") | |
Timber.d("ns/iterations: ${tracker.timePerIterationNs}") | |
} | |
private data class RandomData( | |
val num: Int, | |
val string: String, | |
val bool: Boolean | |
) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.quizlet.perf | |
class PerfTracker { | |
private val trackers = HashMap<String, PerfData>() | |
fun get(key: String) = trackers.getOrDefault(key, PerfData()) | |
class PerfData { | |
private var iterations: Int = 0 | |
private var timeTakenNs: Long = 0L | |
val totalTimeNs: Long | |
get() = timeTakenNs | |
val timePerIterationNs: Long | |
get() = totalTimeNs / iterations | |
fun measure(f: () -> Unit) { | |
val _startTimeNs = System.nanoTime() | |
f() | |
val durationNs = System.nanoTime() - _startTimeNs | |
timeTakenNs += durationNs | |
iterations++ | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
com.quizlet.perf.JacksonTests#objectMapper_create
com.quizlet.perf.JacksonTests#objectReader_create_cache
JacksonTests.objectReader_create_noCache
JacksonTests.objectWriter_create_cache
JacksonTests.objectWriter_create_noCache