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