[kotlin] inline , noinline, crossline function
2021. 6. 18. 09:03ㆍ모바일/Android_Kotlin
inline , noinline, crossline function
inline
- 함수의 인자로 고차함수를 사용한 함수를 전달할 때 inline 을 사용하고, 익명 클래스의 생성 비용을 줄인다
- 람다를 사용하면 각 함수는 객체로 변환되어 메모리 할당, 가상 호출 단계를 거치는데 이 비용을 줄일 수 있다.
- Calculator 함수로 예를 들어보겠습니당
fun main() {
val f2: Function2<Int, Int, Int> = { a, b ->
a + b
}
println(calculator(4, 5, f2))
}
fun calculator(a: Int, b: Int, op: Function2<Int, Int, Int>): Int {
return op.invoke(a, b)
}
//출력
9
이 calculator함수를 쭈욱 호출하게 되면 람다식 마다 각각의 객체가 생성되어, 비효율적이다
inline 함수가 아닐때 자바 디컴파일
public final class TestKt {
public static final void main() {
Function2 f2 = (Function2)null.INSTANCE;
int var1 = calculator(4, 5, f2);
boolean var2 = false;
System.out.println(var1);
}
// $FF: synthetic method
public static void main(String[] var0) {
main();
}
public static final int calculator(int a, int b, @NotNull Function2 op) {
Intrinsics.checkNotNullParameter(op, "op");
return ((Number)op.invoke(a, b)).intValue();
}
}
- 이제 inline을 붙이고 decompile해보자
public final class TestKt {
public static final void main() {
Function2 f2 = (Function2)null.INSTANCE;
//calculator의 함수 본문이 main안으로 들어가 객체 생성없이 효율적으로 계속 호출이 가능하다
byte a$iv = 4;
int b$iv = 5;
int $i$f$calculator = false;
int var4 = ((Number)f2.invoke(Integer.valueOf(a$iv), Integer.valueOf(b$iv))).intValue();
boolean var5 = false;
System.out.println(var4);
}
// $FF: synthetic method
public static void main(String[] var0) {
main();
}
public static final int calculator(int a, int b, @NotNull Function2 op) {
int $i$f$calculator = 0;
Intrinsics.checkNotNullParameter(op, "op");
return ((Number)op.invoke(a, b)).intValue();
}
}
언제 사용하는가?
- Kotlin in Action에서 `이미 JVM은 강력하게 inline을 지원하고 있고, JVM은 코드 실행 분석을 통해 가장 이익이 되는 방법으로 inline을 하고 있다.. 라고 합니다
- 따라서 이미 JVM에서 inline을 하고 있으므로 파라메터에 Higher-Order functions을 넘겨주는 형태가 아니라면 굳이 inline을 적용할 필요가 크지 않음을 알 수 있다.
참조
'모바일 > Android_Kotlin' 카테고리의 다른 글
[Kotlin] apply, with, let, also, run, 범위 지정, 수신 객체 지정 람다, 확장함수 (0) | 2021.06.21 |
---|---|
[kotlin] High-Order-Function (0) | 2021.06.18 |
[kotlin] class, object, companion object (0) | 2021.06.17 |
[kotlin] 함수 리터럴 (with receiver) (0) | 2021.06.17 |
[Kotlin] 람다 총정리 (0) | 2021.06.15 |