リストにたくさんのアイテムがあり、コンテンツを分析して、それらのいくつが「完了」しているかを調べる必要があります。パーティションから始めましたが、リストを 2 つ戻す必要がないことに気付き、フォールドに切り替えました。
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 を修正しますが、変数を導入します。
GCを悪用せずにvarを使用せずにこれを行う方法があるかどうか疑問に思っていましたか?
編集:
私が受け取った答えを強く求めます。var 実装は、より機能的であるが同等であるはずの末尾再帰最適化バージョンよりも、大きなリストでかなり高速 (40% など) のようです。
dhg からの最初の回答は、末尾再帰のパフォーマンスと同等のようです。これは、サイズ パスが非常に効率的であることを意味します。実際、最適化すると、末尾再帰よりもわずかに速く実行されます。私のハードウェア。