Created
September 19, 2018 01:24
-
-
Save ajalt/c6c120c7cc13a49bc2a8bf62d433d455 to your computer and use it in GitHub Desktop.
Kotlin Sequence and List benchmarks
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
Version | Benchmark | Chain length | Size | Mode | Threads | Samples | Score | Score Error (99.9%) | Unit | |
---|---|---|---|---|---|---|---|---|---|---|
list | FilterMap | 16 | 10 | avgt | 1 | 5 | 1277.371279 | 147.630256 | ns/op | |
list | FilterMap | 16 | 100 | avgt | 1 | 5 | 10317.769747 | 427.153017 | ns/op | |
list | FilterMap | 16 | 100000 | avgt | 1 | 5 | 11173707.887053 | 482200.221613 | ns/op | |
list | FilterMap | 16 | 10000 | avgt | 1 | 5 | 1008029.931625 | 187502.327396 | ns/op | |
list | FilterMap | 16 | 1000 | avgt | 1 | 5 | 111698.610383 | 27879.100909 | ns/op | |
list | FilterMap | 16 | 1000000 | avgt | 1 | 5 | 106054961.125894 | 9811365.862410 | ns/op | |
list | FilterMap | 2 | 10 | avgt | 1 | 5 | 153.894645 | 10.388182 | ns/op | |
list | FilterMap | 2 | 100 | avgt | 1 | 5 | 1338.378302 | 107.043631 | ns/op | |
list | FilterMap | 2 | 100000 | avgt | 1 | 5 | 1277251.906548 | 197481.486563 | ns/op | |
list | FilterMap | 2 | 10000 | avgt | 1 | 5 | 126032.382485 | 12090.655297 | ns/op | |
list | FilterMap | 2 | 1000 | avgt | 1 | 5 | 12092.215378 | 1495.591296 | ns/op | |
list | FilterMap | 2 | 1000000 | avgt | 1 | 5 | 14134248.769597 | 1720311.858707 | ns/op | |
list | FilterMapSlow | 2 | 10 | avgt | 1 | 5 | 12816890.182689 | 185429.203849 | ns/op | |
list | FilterMapSlow | 2 | 100 | avgt | 1 | 5 | 127408850.382278 | 2610685.994212 | ns/op | |
list | FilterMapSlow | 2 | 1000 | avgt | 1 | 5 | 1289034012.500000 | 37178830.408821 | ns/op | |
list | FilterMap | 4 | 10 | avgt | 1 | 5 | 303.048783 | 16.981560 | ns/op | |
list | FilterMap | 4 | 100 | avgt | 1 | 5 | 2593.566459 | 265.269761 | ns/op | |
list | FilterMap | 4 | 100000 | avgt | 1 | 5 | 2385976.201745 | 267580.074866 | ns/op | |
list | FilterMap | 4 | 10000 | avgt | 1 | 5 | 225600.529554 | 26443.662527 | ns/op | |
list | FilterMap | 4 | 1000 | avgt | 1 | 5 | 24657.101300 | 1393.101102 | ns/op | |
list | FilterMap | 4 | 1000000 | avgt | 1 | 5 | 27937769.317258 | 2738136.179479 | ns/op | |
list | FilterMap | 8 | 10 | avgt | 1 | 5 | 662.954066 | 37.714916 | ns/op | |
list | FilterMap | 8 | 100 | avgt | 1 | 5 | 5403.228566 | 806.042108 | ns/op | |
list | FilterMap | 8 | 100000 | avgt | 1 | 5 | 4809282.068814 | 264064.473641 | ns/op | |
list | FilterMap | 8 | 10000 | avgt | 1 | 5 | 587773.279763 | 78377.873622 | ns/op | |
list | FilterMap | 8 | 1000 | avgt | 1 | 5 | 54828.001003 | 11432.532949 | ns/op | |
list | FilterMap | 8 | 1000000 | avgt | 1 | 5 | 48178032.493521 | 3629573.060591 | ns/op | |
list | MapFirst | 0 | 10 | avgt | 1 | 5 | 11831998.102204 | 975944.748092 | ns/op | |
list | MapFirst | 0 | 100 | avgt | 1 | 5 | 118417507.575134 | 9400214.083478 | ns/op | |
list | MapFirst | 0 | 1000 | avgt | 1 | 5 | 1242597868.333334 | 23321695.648130 | ns/op | |
seq | FilterMap | 16 | 10 | avgt | 1 | 5 | 1522.270493 | 189.367104 | ns/op | |
seq | FilterMap | 16 | 100 | avgt | 1 | 5 | 13420.159025 | 2945.070231 | ns/op | |
seq | FilterMap | 16 | 100000 | avgt | 1 | 5 | 14683267.762912 | 1563054.947920 | ns/op | |
seq | FilterMap | 16 | 10000 | avgt | 1 | 5 | 1414022.069960 | 285410.936248 | ns/op | |
seq | FilterMap | 16 | 1000 | avgt | 1 | 5 | 136034.296537 | 20794.022249 | ns/op | |
seq | FilterMap | 16 | 1000000 | avgt | 1 | 5 | 150070914.168480 | 12281220.676090 | ns/op | |
seq | FilterMap | 2 | 10 | avgt | 1 | 5 | 113.724262 | 23.340130 | ns/op | |
seq | FilterMap | 2 | 100 | avgt | 1 | 5 | 886.639562 | 100.965227 | ns/op | |
seq | FilterMap | 2 | 100000 | avgt | 1 | 5 | 1114471.073019 | 104579.097377 | ns/op | |
seq | FilterMap | 2 | 10000 | avgt | 1 | 5 | 113331.613363 | 19047.757801 | ns/op | |
seq | FilterMap | 2 | 1000 | avgt | 1 | 5 | 8452.006622 | 852.139007 | ns/op | |
seq | FilterMap | 2 | 1000000 | avgt | 1 | 5 | 12600135.273988 | 819736.712129 | ns/op | |
seq | FilterMapSlow | 2 | 10 | avgt | 1 | 5 | 12853240.985657 | 302520.763852 | ns/op | |
seq | FilterMapSlow | 2 | 100 | avgt | 1 | 5 | 127087895.440506 | 1888198.079783 | ns/op | |
seq | FilterMapSlow | 2 | 1000 | avgt | 1 | 5 | 1284489362.500000 | 14710935.604486 | ns/op | |
seq | FilterMap | 4 | 10 | avgt | 1 | 5 | 237.735671 | 21.938428 | ns/op | |
seq | FilterMap | 4 | 100 | avgt | 1 | 5 | 2076.299701 | 285.806890 | ns/op | |
seq | FilterMap | 4 | 100000 | avgt | 1 | 5 | 2183836.164934 | 236644.888485 | ns/op | |
seq | FilterMap | 4 | 10000 | avgt | 1 | 5 | 188472.074530 | 27674.197560 | ns/op | |
seq | FilterMap | 4 | 1000 | avgt | 1 | 5 | 22206.451125 | 6890.664381 | ns/op | |
seq | FilterMap | 4 | 1000000 | avgt | 1 | 5 | 22573632.804291 | 1797925.338111 | ns/op | |
seq | FilterMap | 8 | 10 | avgt | 1 | 5 | 741.729337 | 50.554732 | ns/op | |
seq | FilterMap | 8 | 100 | avgt | 1 | 5 | 6799.889998 | 638.194707 | ns/op | |
seq | FilterMap | 8 | 100000 | avgt | 1 | 5 | 7030095.062536 | 936554.331832 | ns/op | |
seq | FilterMap | 8 | 10000 | avgt | 1 | 5 | 692726.076515 | 97776.821774 | ns/op | |
seq | FilterMap | 8 | 1000 | avgt | 1 | 5 | 67086.000407 | 6165.119676 | ns/op | |
seq | FilterMap | 8 | 1000000 | avgt | 1 | 5 | 71752273.526742 | 13117574.540667 | ns/op | |
seq | MapFirst | 0 | 10 | avgt | 1 | 5 | 4476886.396934 | 286629.484749 | ns/op | |
seq | MapFirst | 0 | 100 | avgt | 1 | 5 | 4781034.571271 | 419745.305641 | ns/op | |
seq | MapFirst | 0 | 1000 | avgt | 1 | 5 | 4867684.354762 | 137756.258942 | ns/op |
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
open class SequenceBenchmarks { | |
lateinit var list_10: List<Int> | |
lateinit var list_100: List<Int> | |
lateinit var list_1_000: List<Int> | |
lateinit var list_10_000: List<Int> | |
lateinit var list_100_000: List<Int> | |
lateinit var list_1_000_000: List<Int> | |
@Setup | |
fun setup() { | |
list_10 = List(10) { it } | |
list_100 = List(100) { it } | |
list_1_000 = List(1_000) { it } | |
list_10_000 = List(10_000) { it } | |
list_100_000 = List(100_000) { it } | |
list_1_000_000 = List(1_000_000) { it } | |
} | |
@Benchmark fun listFilterMap2slow_10() = listFilterMap2slow(list_10) | |
@Benchmark fun listFilterMap2slow_100() = listFilterMap2slow(list_100) | |
@Benchmark fun listFilterMap2slow_1_000() = listFilterMap2slow(list_1_000) | |
@Benchmark fun listMapFirst_10() = listMapFirst(list_10) | |
@Benchmark fun listMapFirst_100() = listMapFirst(list_100) | |
@Benchmark fun listMapFirst_1_000() = listMapFirst(list_1_000) | |
@Benchmark fun listFilterMap2_10() = listFilterMap2(list_10) | |
@Benchmark fun listFilterMap2_100() = listFilterMap2(list_100) | |
@Benchmark fun listFilterMap2_1_000() = listFilterMap2(list_1_000) | |
@Benchmark fun listFilterMap2_10_000() = listFilterMap2(list_10_000) | |
@Benchmark fun listFilterMap2_100_000() = listFilterMap2(list_100_000) | |
@Benchmark fun listFilterMap2_1_000_000() = listFilterMap2(list_1_000_000) | |
@Benchmark fun listFilterMap4_10() = listFilterMap4(list_10) | |
@Benchmark fun listFilterMap4_100() = listFilterMap4(list_100) | |
@Benchmark fun listFilterMap4_1_000() = listFilterMap4(list_1_000) | |
@Benchmark fun listFilterMap4_10_000() = listFilterMap4(list_10_000) | |
@Benchmark fun listFilterMap4_100_000() = listFilterMap4(list_100_000) | |
@Benchmark fun listFilterMap4_1_000_000() = listFilterMap4(list_1_000_000) | |
@Benchmark fun listFilterMap8_10() = listFilterMap8(list_10) | |
@Benchmark fun listFilterMap8_100() = listFilterMap8(list_100) | |
@Benchmark fun listFilterMap8_1_000() = listFilterMap8(list_1_000) | |
@Benchmark fun listFilterMap8_10_000() = listFilterMap8(list_10_000) | |
@Benchmark fun listFilterMap8_100_000() = listFilterMap8(list_100_000) | |
@Benchmark fun listFilterMap8_1_000_000() = listFilterMap8(list_1_000_000) | |
@Benchmark fun listFilterMap16_10() = listFilterMap16(list_10) | |
@Benchmark fun listFilterMap16_100() = listFilterMap16(list_100) | |
@Benchmark fun listFilterMap16_1_000() = listFilterMap16(list_1_000) | |
@Benchmark fun listFilterMap16_10_000() = listFilterMap16(list_10_000) | |
@Benchmark fun listFilterMap16_100_000() = listFilterMap16(list_100_000) | |
@Benchmark fun listFilterMap16_1_000_000() = listFilterMap16(list_1_000_000) | |
@Benchmark fun seqFilterMap2slow_10() = seqFilterMap2slow(list_10) | |
@Benchmark fun seqFilterMap2slow_100() = seqFilterMap2slow(list_100) | |
@Benchmark fun seqFilterMap2slow_1_000() = seqFilterMap2slow(list_1_000) | |
@Benchmark fun seqMapFirst_10() = seqMapFirst(list_10) | |
@Benchmark fun seqMapFirst_100() = seqMapFirst(list_100) | |
@Benchmark fun seqMapFirst_1_000() = seqMapFirst(list_1_000) | |
@Benchmark fun seqFilterMap2_10() = seqFilterMap2(list_10) | |
@Benchmark fun seqFilterMap2_100() = seqFilterMap2(list_100) | |
@Benchmark fun seqFilterMap2_1_000() = seqFilterMap2(list_1_000) | |
@Benchmark fun seqFilterMap2_10_000() = seqFilterMap2(list_10_000) | |
@Benchmark fun seqFilterMap2_100_000() = seqFilterMap2(list_100_000) | |
@Benchmark fun seqFilterMap2_1_000_000() = seqFilterMap2(list_1_000_000) | |
@Benchmark fun seqFilterMap4_10() = seqFilterMap4(list_10) | |
@Benchmark fun seqFilterMap4_100() = seqFilterMap4(list_100) | |
@Benchmark fun seqFilterMap4_1_000() = seqFilterMap4(list_1_000) | |
@Benchmark fun seqFilterMap4_10_000() = seqFilterMap4(list_10_000) | |
@Benchmark fun seqFilterMap4_100_000() = seqFilterMap4(list_100_000) | |
@Benchmark fun seqFilterMap4_1_000_000() = seqFilterMap4(list_1_000_000) | |
@Benchmark fun seqFilterMap8_10() = seqFilterMap8(list_10) | |
@Benchmark fun seqFilterMap8_100() = seqFilterMap8(list_100) | |
@Benchmark fun seqFilterMap8_1_000() = seqFilterMap8(list_1_000) | |
@Benchmark fun seqFilterMap8_10_000() = seqFilterMap8(list_10_000) | |
@Benchmark fun seqFilterMap8_100_000() = seqFilterMap8(list_100_000) | |
@Benchmark fun seqFilterMap8_1_000_000() = seqFilterMap8(list_1_000_000) | |
@Benchmark fun seqFilterMap16_10() = seqFilterMap16(list_10) | |
@Benchmark fun seqFilterMap16_100() = seqFilterMap16(list_100) | |
@Benchmark fun seqFilterMap16_1_000() = seqFilterMap16(list_1_000) | |
@Benchmark fun seqFilterMap16_10_000() = seqFilterMap16(list_10_000) | |
@Benchmark fun seqFilterMap16_100_000() = seqFilterMap16(list_100_000) | |
@Benchmark fun seqFilterMap16_1_000_000() = seqFilterMap16(list_1_000_000) | |
private fun listFilterMap2(list: List<Int>) = list | |
.filter { true }.map { it } | |
private fun listFilterMap4(list: List<Int>) = list | |
.filter { true }.map { it }.filter { true }.map { it } | |
private fun listFilterMap8(list: List<Int>) = list | |
.filter { true }.map { it }.filter { true }.map { it } | |
.filter { true }.map { it }.filter { true }.map { it } | |
private fun listFilterMap16(list: List<Int>) = list | |
.filter { true }.map { it }.filter { true }.map { it } | |
.filter { true }.map { it }.filter { true }.map { it } | |
.filter { true }.map { it }.filter { true }.map { it } | |
.filter { true }.map { it }.filter { true }.map { it } | |
private fun listFilterMap2slow(list: List<Int>) = list | |
.filter { true }.map { Thread.sleep(0, 5000); it } | |
private fun listMapFirst(list: List<Int>) = list | |
.map { Thread.sleep(0, 5000); it }.first { it > 2 } | |
private fun seqFilterMap2(list: List<Int>) = list | |
.asSequence() | |
.filter { true }.map { it } | |
.toList() | |
private fun seqFilterMap4(list: List<Int>) = list | |
.asSequence() | |
.filter { true }.map { it }.filter { true }.map { it } | |
.toList() | |
private fun seqFilterMap8(list: List<Int>) = list | |
.asSequence() | |
.filter { true }.map { it }.filter { true }.map { it } | |
.filter { true }.map { it }.filter { true }.map { it } | |
.toList() | |
private fun seqFilterMap16(list: List<Int>) = list | |
.asSequence() | |
.filter { true }.map { it }.filter { true }.map { it } | |
.filter { true }.map { it }.filter { true }.map { it } | |
.filter { true }.map { it }.filter { true }.map { it } | |
.filter { true }.map { it }.filter { true }.map { it } | |
.toList() | |
private fun seqFilterMap2slow(list: List<Int>) = list | |
.asSequence() | |
.filter { true }.map { Thread.sleep(0, 5000); it } | |
.toList() | |
private fun seqMapFirst(list: List<Int>) = list | |
.asSequence() | |
.map { Thread.sleep(0, 5000); it }.first { it > 2 } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment