Kotlin's scoped extensions micro-benchmarked
How do they get compiled, what is the runtime cost we can expect?
My last post was about an approach to use Kotlin's scoped extension methods to implement an application with data oriented design paradigm. Yes, I'm still coding that game engine, that's why I had to do a simple benchmark, just to get a feeling how performance could get better or worse. See it as a brain dump. Very unprofessional benchmark with the println statement, but I wanted to get the relation between the simple baseline implementation and the extension method version, like this:
import org.openjdk.jmh.annotations.Benchmark interface Extension<ELEMENT>{ fun ELEMENT.prettyPrint() { println("Default pretty " + this) } } object StringListExtension : Extension<String> fun <T> someFrameWorkFunction(parameter : T, extensionProvider: Extension<T>) { with(extensionProvider) { parameter.prettyPrint() } } @Benchmark fun extension() { someFrameWorkFunction("asd", StringListExtension) } fun String.prettyPrint() { println("Default pretty " + this) } @Benchmark fun baseline() { "asd".prettyPrint() }
Surprising results again:
Benchmark Mode Cnt Score Error Units BenchmarkRunner.benchmarkBaseline thrpt 200 269087.160 ± 17915.393 ops/s BenchmarkRunner.benchmarkExtension thrpt 200 329648.131 ± 19646.005 ops/s
Once again, the opposite of my expectations.