Kotlin – Расходы на более высокие порядки?

Существуют ли затраты на функции более высокого порядка? Я могу решить некоторые проблемы с ним легко, но я не уверен, что это может повлиять на производительность. Есть ли какие-то ограничения?

Lambdas переданы функции более высокого порядка , скомпилированные для общих объектов Function . Этот подход, безусловно, добавляет некоторые издержки, также из-за боковых накладных расходов, когда задействованы примитивные типы.
Так что да, это может повлиять на производительность. Вы должны использовать inline функции более высокого порядка, когда это имеет смысл, потому что вышеупомянутые оговорки больше не будут проблематичными.

Взятые из документов:

Использование функций более высокого порядка накладывает определенные штрафы во время выполнения : каждая функция является объектом, и она захватывает замыкание, то есть те переменные, к которым обращаются в теле функции. Распределение памяти (как для объектов-функций, так и классов) и виртуальных вызовов представляет собой служебные данные времени выполнения.

Но, похоже, во многих случаях этот вид накладных расходов можно устранить, вставив лямбда-выражения .

Однако есть некоторые ограничения для inline . Читайте в документах .

пример

Определение функции более высокого порядка и кода вызывающего абонента:

 fun hoFun(func: (Int) -> Boolean) { func(1337) } //invoke with lambda val mod = 2 hoFun { it % mod == 0 } 

Представление Java-байткода:

 public static final void hoFun(@NotNull Function1 func) { Intrinsics.checkParameterIsNotNull(func, "func"); func.invoke(1337); } final int mod = 2; hoFun((Function1)(new Function1() { public Object invoke(Object var1) { return this.invoke(((Number)var1).intValue()); } public final boolean invoke(int it) { return it % mod == 0; } })); 

Как уже упоминалось, лямбда скомпилирована в объект Function . Каждый вызов приводит к созданию нового объекта Function потому что mod необходимо захватить. Вместо захвата lambdas вместо этого используются экземпляры Function Singleton.

С inline модификатором, примененным к функции более высокого порядка, скомпилированный вызов выглядит намного лучше:

 int mod = 2; int it = 1337; if (it % mod == 0) { ; }