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