It seems there is a 30-40% performance degradation of PersistentHashMap.valAt(...) in Clojure 1.4. Possibly due to references to new CPU-hungry implementation of Util.hasheq(...).
Consider the following snippet:
(println "Version: " (clojure-version))
(def mm 10000)
(def str-keys (map str (range mm)))
(def m (zipmap str-keys (range mm)))
(time (dotimes [i mm] (doseq [k str-keys] (m k))))
(def kw-keys (map #(keyword (str %)) (range mm)))
(def m (zipmap kw-keys (range mm)))
(time (dotimes [i mm] (doseq [k kw-keys] (m k))))
(def sym-keys (map #(symbol (str %)) (range mm)))
(def m (zipmap sym-keys (range mm)))
(time (dotimes [i mm] (doseq [k sym-keys] (m k))))
Running this code with Clojure 1.3 and 1.4 yields some interesting output (actual numbers depend on your machine).
$ lein run-all
...
Version: 1.3.0
"Elapsed time: 3549.974 msecs"
"Elapsed time: 3613.319 msecs"
"Elapsed time: 3350.744 msecs"
...
Version: 1.4.0
"Elapsed time: 6007.356 msecs"
"Elapsed time: 5926.243 msecs"
"Elapsed time: 5756.16 msecs"
Playing with a profiler leads to PersistentHashMap.
According to profiler report the new PersistentHashMap.valAt(...) from 1.4 spends more cycles on its own 3208ms --> 3917ms, plus, on further calls to Util.hasheq(...) 900ms --> 2684ms.
Copyright © 2012 Oleksandr Shyshko
Distributed under the Eclipse Public License, the same as Clojure.