4

私のプロジェクトでは、多くのクライアントがサーバーでマップを変更します。ref次のようにofを使用しますmap

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

dosyncそして、STM 方式を使用してこのマップを更新します。しかし、私はそれが私が望むほど速くないことに気づきました:

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

そこで、Clojure の組み込みマップと STM の代わりにネイティブ Java CuncurrentHashMap を使用することにしました。Java CuncurrentHashMap を Clojure にラップして、Clojure マップのように assoc、contains?、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 に答える