リストにはたくさんの項目がありますが、どれくらいの項目が「完全」であるかを調べるにはコンテンツを分析する必要があります。私はパーティションで始まったが、その後、私は戻って二つのリストを必要としなかったことに気づいたので、私は倍に切り替え:割り付けやvarsを避けながら、scalaのリストを効率的に折りたたむ
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 はになる可能性がありますが、折りたたまれたすべてのアイテムに新しいタプルが割り当てられることを理解しているので、これは疑わしいです)。
当分の間、私はGCが修正されていますが、VARSを紹介
var complete = 0
var incomplete = 0
list.foreach(row => if(row.time != 0) complete += 1 else incomplete += 1)
としてこれを書き換えました。
GCを悪用せずに、varsを使用せずにこれを行う方法があるのだろうか?
編集:私は受け取った回答に
ハードコール。 var実装はより機能的ですが同等でなければならないtail-recursive最適化バージョンよりも大きなリスト(40%など)ではかなり高速です。
dhgからの最初の答えは、tail-recursiveのパフォーマンスと同じレベルにあるように見えます。これは、サイズパスが超効率的であることを意味しています...実際、最適化すると、私のハードウェア上の再帰的なもの。
多くのアイテムがあり、終了/未完了アイテムが頻繁にカウントされているようです。代わりに、コンパニオンオブジェクトに2つのカウンタを保持して、項目がコンストラクタ内のリストに追加されたときに1つをバンプし、time!= 0のときにカウントを設定することができますか? – AmigoNico
私は他のコメントに同意します。折りたたみの質問は赤いニシンです。 「並列ユーザーが多数いる場合、多くの行があります」とは、並列ジョブが完了し、完了したジョブが必要であることを意味します。 Future.onCompleteのカウントをバンプするか、その完了時に集計してトリガーします(つまり、すべて完了するまで待機します)。 –