4

在我的项目中,许多客户将修改服务器中的地图。我使用refof map,像这样:

(def dict (ref {})) ; the map we play with

我使用dosyncSTM 方式更新此地图。但我发现它没有我希望的那么快:

user=> (time (dotimes [n 1000000] (dosync ( alter xx assoc xx 1 1))))
"Elapsed time: 2470.766 msecs"

所以我决定使用原生 Java CuncurrentHashMap 来代替 Clojure 内置的 map 和 STM。如何将 Java CuncurrentHashMap 包装到 Clojure 中,以便我可以像 Clojure 映射一样修改它,使用 assoc、包含?、dissoc 等等。这将使我修改最少的代码行。

有没有办法做到这一点?

4

1 回答 1

7

您可以使用atom,因为您只修改了一个不需要事务的值,因此不需要ref

user=> (def dict (atom {}))
user=> (time (dotimes [n 1000000] (swap! dict assoc :xx 1)))
"Elapsed time: 108.105703 msecs"
于 2012-06-18T08:24:55.570 回答