Local functions
fun someMath(a: Int): Int {
fun sumSquare(b: Int) = (a + b) * (a + b)
return sumSquare(1) + sumSquare(2)
}
以上local funtion編譯為java后其實(shí)是由匿名內(nèi)部類實(shí)現(xiàn)的,每次調(diào)用local function就會(huì)創(chuàng)建一個(gè)Function對(duì)象胳泉,同時(shí)涉及到參數(shù)的box和unbox
public static final int someMath(final int a) {
Function1 sumSquare$ = new Function1(1) {
// $FF: synthetic method
// $FF: bridge method
public Object invoke(Object var1) {
return Integer.valueOf(this.invoke(((Number)var1).intValue()));
}
public final int invoke(int b) {
return (a + b) * (a + b);
}
};
return sumSquare$.invoke(1) + sumSquare$.invoke(2);
}
解決方法:使用non-capture local function雷激。每次調(diào)用會(huì)重用同一Function璧疗,并且沒有參數(shù)box和unbox
Null safety
fun sayHello(who: String) {
println("Hello $who")
}
kotlin public 方法中non-null參數(shù)編譯為Java后有一個(gè)Intrinsics的靜態(tài)方法調(diào)用(overhead很薪缘摹)悲敷。(private 方法沒有究恤,因?yàn)橛蒶otlin編譯器保障)
public static final void sayHello(@NotNull String who) {
Intrinsics.checkParameterIsNotNull(who, "who");
String var1 = "Hello " + who;
System.out.println(var1);
}
要想去掉這些靜態(tài)方法,使用編譯器選項(xiàng)-Xno-param-assertions或者在proguard文件中使用rule:
-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
static void checkParameterIsNotNull(java.lang.Object, java.lang.String);
}
Nullable primitive types
a nullable type is always a reference type
primitive type變量定義為nullable type會(huì)進(jìn)行box后德。使用non-nullable type則可以避免box, 直接使用primitive type
About arrays
如果要?jiǎng)?chuàng)建primitive type的數(shù)組丁溅,總是使用IntArray, FloatArray等探遵,不要使用泛型Array<T>窟赏,因?yàn)闀?huì)導(dǎo)致box
Varargs
當(dāng)調(diào)用vararg參數(shù)的函數(shù)時(shí),會(huì)創(chuàng)建一個(gè)新的數(shù)組箱季,這樣會(huì)產(chǎn)生性能損耗涯穷。
fun printDouble(vararg values: Int) {
values.forEach { println(it * 2) }
}
printDouble(1, 2, 3)
printDouble(new int[]{1, 2, 3});
盡量避免使用vararg,而是將參數(shù)聲明為Array
Refer:
https://medium.com/@BladeCoder/exploring-kotlins-hidden-costs-part-2-324a4a50b70