我的列表中有一堆项目,我需要分析内容以找出其中有多少是“完整的”。我从分区开始,但后来意识到我不需要两个列表,所以我切换到折叠:
val counts = groupRows.foldLeft( (0,0) )( (pair, row) =>
if(row.time == 0) (pair._1+1,pair._2)
else (pair._1, pair._2+1)
)
但是对于很多并行用户,我有很多行要经过,这导致了很多 GC 活动(我的假设...... GC可能来自其他东西,但我怀疑这是因为我理解它将在每个折叠的项目上分配一个新的元组)。
目前,我已将其重写为
var complete = 0
var incomplete = 0
list.foreach(row => if(row.time != 0) complete += 1 else incomplete += 1)
它修复了 GC,但引入了 vars。
我想知道是否有一种方法可以在不使用 vars 的同时又不滥用 GC 来做到这一点?
编辑:
强烈要求我收到的答案。var 实现在大型列表上似乎要快得多(比如 40%),甚至比功能更强大但应该等效的尾递归优化版本要快得多。
dhg 的第一个答案似乎与尾递归的性能相当,这意味着尺寸传递是超级高效的......事实上,当优化时,它的运行速度比尾递归的快一点我的硬件。