Kotlin forEach隐藏开销

Kotlin中for-each有多种写法, 如常用的:

for (foo in foos) { foo.thing() }
foos.forEach { it.thing() }

除了对于 nullable / break 支持的区别,大部分情况下使用哪种写法纯粹是偏好:
for vs forEach

然而针对Range进行枚举时要注意: forEach{} 存在着隐藏开销。

尽管 Iterable<T>.forEach 的方法签名是一个简单的 for (foo in foos) ,但实际上
(0..i).forEach {} 对应Bytecode会生成 Iterable/Iterator

Iterable $receiver$iv = (Iterable)(new IntRange(0, i));
Iterator var3 = $receiver$iv.iterator();
while(var3.hasNext()) {
    int element$iv = ((IntIterator)var3).nextInt();
    ...

for (it in 0..i) {} 生成的Bytecode则是没有额外开销的 while loop :

int it = 0;
int var3 = i;
if(it <= var3) {
    while(true) { 
        ...

Range较大、多重循环等场合, (Iterable)(new IntRange(0, i))Iterator var3 = $receiver$iv.iterator(); 会带来不小的性能开销。

结论: 针对Range进行枚举时尽量用 for in

原文链接(
关于Kotlin各方面的隐藏开销分析及具体的测试):

https://medium.com/@BladeCoder/exploring-kotlins-hidden-costs-part-1-fbb9935d9b62
https://sites.google.com/a/athaydes.com/renato-athaydes/posts/kotlinshiddencosts-benchmarks

comments powered by Disqus