Performance drop in PersistentHashMap.valAt(...) in v.1.4 -- Util.hasheq(...) ?
Description
Environment
Java(TM) SE Runtime Environment (build 1.7.0_04-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)
Attachments
- 03 Dec 2012, 05:30 PM
- 22 May 2012, 04:06 AM
- 22 May 2012, 04:06 AM
Activity
import December 11, 2012 at 8:13 PM
Comment made by: oshyshko
The performance with 1.5-master is now very close to 1.3 for 3/4 of the benchmark.
However, this code is still showing 43% performance drop (3411 ms VS 6030 ms – 1.3 VS 1.5-master):
(def str-keys (map str (range mm)))
(def m (zipmap str-keys (range mm)))
(time (dotimes [i mm] (doseq [k str-keys] (m k))))
Version: 1.3.0
"Elapsed time: 3411.353 msecs" <---
"Elapsed time: 3459.992 msecs"
"Elapsed time: 3365.182 msecs"
"Elapsed time: 3813.637 msecs"
Version: 1.4.0
"Elapsed time: 5710.073 msecs" <---
"Elapsed time: 5817.356 msecs"
"Elapsed time: 5774.856 msecs"
"Elapsed time: 18754.482 msecs"
Version: 1.5.0-master-SNAPSHOT
"Elapsed time: 6030.247 msecs" <---
"Elapsed time: 3372.637 msecs"
"Elapsed time: 3267.481 msecs"
"Elapsed time: 3852.927 msecs"
To reproduce:
$ git clone https://github.com/clojure/clojure.git
$ cd clojure
$ mvn install -Dmaven.test.skip=true
$ cd ..
$ git clone https://github.com/oshyshko/clj-perf.git
$ cd clj-perf
$ lein run-all
import December 10, 2012 at 9:53 PM
Comment made by: oshyshko
Please, could you add as a comment the bench result using 1.3 vs 1.5-master-post-patch?
Timothy Baldridge December 10, 2012 at 5:00 PM
I now get the following results:
Version: 1.4.0
"Elapsed time: 6281.345 msecs"
"Elapsed time: 6344.321 msecs"
"Elapsed time: 6108.55 msecs"
"Elapsed time: 36172.135 msecs"
Version: 1.5.0-master-SNAPSHOT (pre-patch)
"Elapsed time: 6126.337 msecs"
"Elapsed time: 6320.857 msecs"
"Elapsed time: 6237.251 msecs"
"Elapsed time: 18167.05 msecs"
Version: 1.5.0-master-SNAPSHOT (post-patch)
"Elapsed time: 6501.929 msecs"
"Elapsed time: 3861.987 msecs"
"Elapsed time: 3871.557 msecs"
"Elapsed time: 5049.067 msecs"
Marking as screened
Christophe Grand December 3, 2012 at 5:30 PM
Timothy: I inadvertently deleted a "public" modifier before commiting... fixed in caching-hasheq-v3.diff
Timothy Baldridge December 3, 2012 at 4:38 PM
For some reason I can't get v2 to build against master. It applies cleanly, but fails to build.
Details
Details
Assignee
Reporter
Labels
Approval
Patch
Priority

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(...).
I have created a demo project with more details and some profiling information here:
https://github.com/oshyshko/clj-perf