Skip to content

oshyshko/clj-perf

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

clj-perf

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.

Clojure 1.3 image

Clojure 1.4 image

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.

License

Copyright © 2012 Oleksandr Shyshko

Distributed under the Eclipse Public License, the same as Clojure.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published