在我的项目中,许多客户端将修改服务器中的地图。我使用ref
map
,如下所示:
(def dict (ref {})) ; the map we play with
我使用STM方式dosync
更新此地图。但我发现它没有我想要的那么快:
user=> (time (dotimes [n 1000000] (dosync ( alter xx assoc xx 1 1))))
"Elapsed time: 2470.766 msecs"
所以我决定使用原生Java CuncurrentHashMap代替Clojure内置映射和STM。如何将Java CuncurrentHashMap包装到Clojure中,以便我可以像Clojure map一样修改它,使用assoc,contains?,dissoc等。这将使我修改最左边的代码。
有没有办法实现这个目标?
答案 0 :(得分:7)
您可以使用atom
,因为您只修改一个不需要交易的值,因此不需要ref
user=> (def dict (atom {}))
user=> (time (dotimes [n 1000000] (swap! dict assoc :xx 1)))
"Elapsed time: 108.105703 msecs"