Skip to content

Instantly share code, notes, and snippets.

@MarcinMoskala
Created April 7, 2018 09:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MarcinMoskala/a0e01d93575bcb7f6e92dacb95c5df9f to your computer and use it in GitHub Desktop.
Save MarcinMoskala/a0e01d93575bcb7f6e92dacb95c5df9f to your computer and use it in GitHub Desktop.
Compare inline and not inline functions for collection processing
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