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
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
Assignee
Timothy BaldridgeTimothy BaldridgeReporter
importimportLabels
Approval
OkPatch
CodePriority
MajorAffects versions
Fix versions
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