2011-09-27 121 views
5

是否有任何發佈的微基準比較Scala可變集合和不可變集合,以及多線程環境中的集合java.util.concurrent ?我特別感興趣的是讀者遠遠多於編寫者的情況,比如在服務器端代碼中緩存HashMaps。微基準比較Scala可變,不可變集合與java.util.concurrent。*集合

Clojure集合的微基準也是可以接受的,因爲它們的算法類似於Scala 2.8持久集合中使用的算法。

我會寫我自己的,如果還沒有完成,但寫出好的微基準不是微不足道的。

+0

我認爲你不可能得到比較可變集合和不可變集合的任何合理基準,因爲應用程序本身的設計是不同的。 –

+0

@Daniel:我們目前有一些Java服務器代碼,其中包含每次寫入時讀取約1,000,000次的HashMaps。該代碼使用'synchronized',但讀者爲所有這些競爭性讀取付費,即使數據是有效的不可變的。我認爲只有在用包含新項目的新「已複製」集合替換舊集合時,我才能夠使用functionaljava的持久集合並鎖定。 – Ralph

+0

看起來像一個合理的期望,它說明了基準測試的問題。如果你測試這種負載,你是爲了不變性而進行偏置。但請注意,使用不可變映射時,無論何時更新,都必須重新映射映射,這意味着您需要以某種方式序列化所有更新。如果您不介意讀取滯後寫入,那麼映射本身可能會被一個易變的指向。 –

回答

2

有一些成果在這裏比較的Java哈希映射,斯卡拉哈希映射,Java的併發哈希映射,Java的併發跳躍列表,Java的並行陣列和Scala並行集合(在技術報告的結尾):

http://infoscience.epfl.ch/record/165523/files/techrep.pdf

有併發跳躍列表和Java併發散的更詳細的比較映射在這裏(也以報告的主要部分的結束,闌尾前):

http://infoscience.epfl.ch/record/166908/files/ctries-techreport.pdf

這些微基準專注於測試單個操作的性能。如果你打算寫你自己的基準,這將可能是有用的:

http://buytaert.net/files/oopsla07-georges.pdf

+0

非常好!謝謝。 – Ralph

+0

您可以在這裏找到第一篇論文中的一些基準測試的源代碼:http://lampsvn.epfl.ch/svn-repos/scala/scala/trunk/test/benchmarks/,但它們有些沒有結構化。對於第二個:https://github.com/axel22/Ctries,看一下src/bench。 – axel22

+0

以下是關於Scala收集操作的詳細基準:https://github.com/scalameter/scalameter/tree/master/src/test/scala/org/scalameter/collections – axel22

0

爲什麼不嘗試使用java.util.concurrent.ConcurrentHashMap呢?這樣你就不必同步,而且你的數百萬次讀取速度會更快(以及一次寫入)。

+1

我認爲這是一個謬論。如果您從HashMap中讀取(可變)值,請更新該值,然後嘗試放回,您仍然必須同步該操作。我不確定你是否可以用'replace'來完成。 – Ralph

+0

另一種選擇是使用Clojure的STM(可以使用Java)。雖然我不確定你會如何使用HashMap ... – Chochos