Приложения лямбда-выражений во встроенных функциях встроены, это заканчивается непосредственно в коде метода.
ользовал следующий код для измерения производительности различных синтаксических конструкций в Kotlin
fun time(what: String, body: () -> Int) {
val start = System.currentTimeMillis()
var sum = 0
repeat(10) {
sum += body()
}
val end = System.currentTimeMillis()
println("$what: ${(end - start) / 10}")
}
val n = 200000000
val rand = Random()
val arr = IntArray(n) { rand.nextInt() }
time("for in range") {
var sum = 0
for (i in (0 until n))
sum += arr[i]
sum
}
time("for in collection") {
var sum = 0
for (x in arr)
sum += x
sum
}
time("forEach") {
var sum = 0
arr.forEach { sum += it }
sum
}
time("range forEach") {
var sum = 0
(0 until n).forEach { sum += arr[it] }
sum
}
time("sum") {
arr.sum()
}
И вот результат, который я получил:
для в диапазоне: 84
за в коллекции: 83
forEach: 86
диапазон для каждого: 294
сумма: 83
Итак, мой вопрос: почему диапазон forEach намного медленнее, чем другие синтаксические конструкции?
Мне кажется, что компилятор может генерировать одинаковый байт-код во всех случаях (но не в случае «range forEach»)