我很好奇在性能方面是否应该优先使用for..in
而不是.each
。
我很好奇在性能方面是否应该优先使用for..in
而不是.each
。
For .. in
是标准的语言流程控制之一。each
调用一个闭包会增加额外的开销。
.each {...}
是语法糖,相当于方法调用.each({...})
。each
代码块中你不能使用break
和continue
语句来控制循环。
http://kunaldabir.blogspot.it/2011/07/groovy-performance-iterating-with.html
更新的基准测试Java 1.8.0_45 Groovy 2.4.3:
lines = (1..100000)
// with list.each {}
start = System.nanoTime()
lines.each { line->
line++;
}
println System.nanoTime() - start
// with loop over list
start = System.nanoTime()
for (line in lines){
line++;
}
println System.nanoTime() - start
results:
break
和continue
存在理解语言和理解它们在该上下文中不起作用的问题,但这是完全合法的,并且有使用break
和continue
传递给each
方法的闭包的有效原因。例如,如果在闭包内部有一个循环或switch语句。 - Jeff Scott Brownbreak
和continue
在那里不起作用时,这表明他们误解了将闭包作为参数传递给each
方法时发生的情况。如果你编写了一个包含continue
的方法,并且你从循环内部调用该方法,那么你期望continue
是什么意思?这就类似于在传递给each
方法的闭包内部使用continue
时发生的情况。 - Jeff Scott Brown
each
改为for-in
对我来说可能是优化技术清单上最后一个要考虑的。只是这么说 :-) 或者换句话说,一次不必要的数据库调用可能相当于数千个经过优化的for-in
循环。 - defectus