Created
April 7, 2018 09:07
-
-
Save MarcinMoskala/a0e01d93575bcb7f6e92dacb95c5df9f to your computer and use it in GitHub Desktop.
Compare inline and not inline functions for collection processing
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
import kotlin.system.measureNanoTime | |
data class Product(val price: Double, val bought: Boolean) | |
fun main(args: Array<String>) { | |
val users = (1..50_000_000).map { Product(10.0, true) } | |
measureNanoTime { code1(users) } | |
measureNanoTime { code2(users) } | |
val tries = 100 | |
var sum1 = 0L | |
var sum2 = 0L | |
for (i in 1..tries) { | |
println(i) | |
val time1 = measureNanoTime { code1(users) } | |
sum1 += time1 | |
println("Time for code 1 = $time1") | |
val time2 = measureNanoTime { code2(users) } | |
println("Time for code 2 = $time2") | |
sum2 += time2 | |
} | |
println("Sum time for 1 = $sum1") | |
println("Sum time for 2 = $sum2") | |
} | |
private fun code1(users: List<Product>) { | |
users.filter { it.bought }.sumByDouble { it.price } | |
} | |
fun code2(users: List<Product>) { | |
users.noinlineFilter { it.bought }.noinlineSumByDouble { it.price } | |
} | |
fun <T> Iterable<T>.noinlineFilter(predicate: (T) -> Boolean): List<T> { | |
val destination = ArrayList<T>() | |
for (element in this) if (predicate(element)) destination.add(element) | |
return destination | |
} | |
fun <T> Iterable<T>.noinlineSumByDouble(selector: (T) -> Double): Double { | |
var sum = 0.0 | |
for (element in this) { | |
sum += selector(element) | |
} | |
return sum | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment