通常,我會根據需要生成一個集合以保存實例數據大小。在收集垃圾之前,消費者可能只會重複收集一次。消費者不關心集合的順序,不需要對它進行排序,當然不需要對它或它的任何元素進行變異。什麼是Scala中最高效的類型安全集合? - 數組?Scala:用於簡單迭代的最高效集合
後來編輯:它發生在我身上,當我可以使用套件時,可能出現相當多的情況。在可能的情況下使用Sets還是隻在真正需要設置功能時才使用它們?
通常,我會根據需要生成一個集合以保存實例數據大小。在收集垃圾之前,消費者可能只會重複收集一次。消費者不關心集合的順序,不需要對它進行排序,當然不需要對它或它的任何元素進行變異。什麼是Scala中最高效的類型安全集合? - 數組?Scala:用於簡單迭代的最高效集合
後來編輯:它發生在我身上,當我可以使用套件時,可能出現相當多的情況。在可能的情況下使用Sets還是隻在真正需要設置功能時才使用它們?
是的,所有收集的數據結構,陣列配備的開銷最少的,當你知道自己提前大小。
如果您事先不知道尺寸,我仍然會選擇ArrayBuffer *。當空間不足時用於擴展底層數組的算法效率與其獲得的效率相同。
做不是*使用(鏈接)列表或流,因爲這些類涉及每個元素一個堆分配。現代JVM垃圾收集器很好,但它們不能免費工作。
*:但請參閱@user unknown對某些微基準的鏈接問題的評論。目前的ArrayBuffer
實施可能不太理想。
也看看.view
。通常你不需要實際存儲中間結果。相反,您可以使用.map
,.filter
和其他來構建集合的「描述」。操作(地圖,過濾器等)只會在遍歷集合時執行,通常在O(1)
空間中執行。缺點是,每次查詢時都會重新計算這些視圖。 (儘管這對於簡單的過濾器和巨大的基礎集合來說可能仍然更高效)
另外,要特別注意可變數據結構的視圖。視圖不捕獲底層數據結構的狀態。當它改變時,視圖也會改變。然而,對不可變數據結構的看法表現得非常好。最後,視圖顯然包含對底層數據結構的引用,這意味着它不會在您的程序保留在視圖中時被垃圾收集。
(更新) 載體似乎求取存儲效率與靈活性之間的良好平衡,特別是對於大的序列。
您是否知道您應該留意使用視圖的其他任何問題(性能或其他)? – sourcedelica
你需要來存儲元素?你不能按需求計算它們嗎?如果您可以根據需要計算值而不是存儲這些值,則可以創建一個Traversable
或Iterable
,它可以在幾乎不使用任何內存的情況下執行此任務(除了類本身以外,沒有任何內存用於Traversable
)。
在特定的情況下,我想的不是。所以Traversable或Iterable看起來是一個不錯的選擇,因爲集合實際上並未實例化。 –
你爲什麼不測量它?我希望,如果你不只是迭代它們,找到最終結果 - 也許爲了獲得集合的大小,但是對每個對象做一些真正的工作,每個對象花費的時間大於在訂單中迭代的時間數量級。 –
@userunknown收集遍歷的基準在這裏進行基準測試:http://paradigmatic.streum.org/2012/02/benchmarking-scala-list-traversal-idioms/和這裏:http://codedependents.com/2012/04/ 30/benchmarking-more-seq-traversal-idioms-in-scala/ – paradigmatic