【问题标题】:Kotlin compiler optimization?Kotlin 编译器优化?
【发布时间】:2020-03-10 02:33:18
【问题描述】:
对于类似的代码是否有某种编译时优化。
还是整个执行的复杂度与每个函数的复杂度一样?
如果是,那么分析这样的代码性能的最佳方法是什么?如果是,它们是否记录在某处?
values
.map { it.someKey }
.distinct()
.sorted()
.fold(ArrayList()) { list, some ->
return newList
}
【问题讨论】:
标签:
android
kotlin
optimization
【解决方案1】:
您可以通过简单的分析找到时间复杂度。例如,我认为(不要引用我的话)distinct 的下限是O(n log n),这使得你的程序的时间复杂度也O(n log n)。
不过,对于实际的基准测试,您应该 read this post on java microbenchmarking
至于编译器的优化,其实我们可以自己试试。
这里有一段和你写的类似的代码段:
fun test(values :List<Test>): String {
return values
.map { it.someValue }
.distinct()
.sorted()
.fold("") {a,b -> a + b }
}
将它插入intellij的编译器和反编译器,插入Java,我们得到
public final String test(@NotNull List values) {
Intrinsics.checkParameterIsNotNull(values, "values");
Iterable $this$fold$iv = values;
Collection destination$iv$iv = new ArrayList(CollectionsKt.collectionSizeOrDefault($this$fold$iv, 10));
Iterator var7 = $this$fold$iv.iterator();
boolean var10;
while(var7.hasNext()) {
Object item$iv$iv = var7.next();
Test it = (Test)item$iv$iv;
var10 = false;
String var12 = it.getSomeValue();
destination$iv$iv.add(var12);
}
$this$fold$iv = (Iterable)CollectionsKt.sorted((Iterable)CollectionsKt.distinct((Iterable)((List)destination$iv$iv)));
Object initial$iv = "";
Object accumulator$iv = initial$iv;
String b;
for(Iterator var15 = $this$fold$iv.iterator(); var15.hasNext(); accumulator$iv = accumulator$iv + b) {
Object element$iv = var15.next();
b = (String)element$iv;
}
return accumulator$iv;
}
您可以看到 Kotlin 编译器如何内联不同的方法,从而提高性能。