Использовал ли inline функцию

Ответ

Inline-функции в Kotlin используются для оптимизации производительности, заменяя вызов функции на её тело во время компиляции. Это полезно для высоконагруженных участков кода или лямбда-выражений, передаваемых в функции высшего порядка (например, filter, map).

Пример:

inline fun measureTime(block: () -> Unit) {
    val start = System.currentTimeMillis()
    block()
    println("Time: ${System.currentTimeMillis() - start}ms")
}

Плюсы:

  • Уменьшает накладные расходы на вызов функции (особенно с лямбдами).
  • Позволяет использовать return из внешней функции внутри лямбды (non-local returns).

Ограничения:

  • Увеличивает размер билда (тело функции вставляется в каждое место вызова).
  • Нельзя использовать для рекурсивных функций или сложных функций с большим телом.

Используйте inline осознанно, только когда это действительно даёт преимущества в производительности.

Ответ 18+ 🔞

А, слушай, про инлайны в котлине? Ну это же, ёпта, классика! Представь, у тебя есть функция, маленькая такая, но вызываешь ты её дохуя раз, прям в самом пиздеце цикла какого-нибудь. И каждый раз, когда ты её вызываешь, система, блядь, тратит время на то, чтобы перепрыгнуть в другое место в памяти, там что-то подготовить, потом обратно вернуться... Овердохуища лишних телодвижений, честно.

Вот чтобы этого не было, придумали inline. Суть проще пареной репы: ты пишешь это слово перед функцией, и компилятор, вместо того чтобы оставлять вызов, тупо вставляет её тело прямо в то место, где ты её вызвал. Как будто ты сам там этот код написал. Никаких прыжков туда-сюда.

Вот смотри, классический пример — замер времени выполнения какого-то блока кода. Без инлайна это была бы просто функция, принимающая лямбду. Но с ним — красота!

inline fun measureTime(block: () -> Unit) {
    val start = System.currentTimeMillis()
    block()
    println("Time: ${System.currentTimeMillis() - start}ms")
}

И когда ты её используешь, компилятор делает волшебство. Вместо вызова measureTime { myHeavyCode() }, он на этапе компиляции разворачивает это всё в:

val start = System.currentTimeMillis()
myHeavyCode()
println("Time: ${System.currentTimeMillis() - start}ms")

Видишь? Вообще хуй с горы, никакой лишней функции. Всё прямо на месте. Особенно это, блядь, кайфово для этих самых функций высшего порядка — filter, map, forEach. Там же под капотом лямбды создаются, объекты... А с inline этого всего нет, просто код подставляется. Производительность, ядрёна вошь, растёт!

И ещё один прикол — non-local returns. Обычно из лямбды ты не можешь просто так return из внешней функции. Ты как бы внутри вложенного блока. А с inline — запросто! Потому что лямбда-то инлайнится, и return становится самым обычным return прямо в твоём коде. Удобно, сука.

Но, чувак, есть же и подводные камни, ёб твою мать! Не надо вешать inline на всё подряд. Если функция большая, рекурсивная или её вызывают всего пару раз — это пиздец как невыгодно. Потому что размер твоего скомпилированного кода (билда) раздуется, как жопа после новогодних праздников. Компилятор будет тупо копировать одно и то же тело функции в кучу мест. Терпения ноль ебать у того, кто потом этот раздутый артефакт будет качать.

Итог простой, как три копейки: используй inline осознанно. Только там, где реально есть проблемы с производительностью из-за частых вызовов мелких функций, особенно с лямбдами. Во всех остальных случаях — да похуй, пусть работает как обычная функция. Не надо из пушки по воробьям, а то сам потом охуеешь от размера апки.