[CLJ-1084] (object-array [1]) is ~3x slower than (object-array (rseq [1])) Created: 09/Oct/12 Updated: 20/Oct/12 Resolved: 20/Oct/12 |
|
| Status: | Closed |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | Release 1.5 |
| Type: | Defect | Priority: | Minor |
| Reporter: | Paul Stadig | Assignee: | Unassigned |
| Resolution: | Completed | Votes: | 1 |
| Labels: | patch, | ||
| Attachments: |
|
| Patch: | Code and Test |
| Approval: | Ok |
| Description |
|
{{user=> (time (dotimes [_ 10000000] (object-array [1]))) This appears to be because PersistentVector$ChunkedSeq does not implement Counted, so RT.count is iterating the ChunkedSeq to get its count. |
| Comments |
| Comment by Paul Stadig [ 09/Oct/12 2:11 PM ] |
|
I don't believe this is Major priority, but I cannot edit the ticket after having created it. |
| Comment by Tassilo Horn [ 11/Oct/12 10:17 AM ] |
|
This patch makes PersistentVector$ChunkedSeq implement Counted. Performance before: (let [v (vec (range 10000))
vs (seq v)]
(time (dotimes [_ 10000]
(count v)))
(time (dotimes [_ 10000]
(count vs))))
;"Elapsed time: 0.862259 msecs"
;"Elapsed time: 7228.72486 msecs"
Performance after (with the patch): (let [v (vec (range 10000))
vs (seq v)]
(time (dotimes [_ 10000]
(count v)))
(time (dotimes [_ 10000]
(count vs))))
;"Elapsed time: 0.967301 msecs"
;"Elapsed time: 0.99391 msecs"
Also with Paul's test case. Before: (time (dotimes [_ 10000000] (object-array [1]))) ;"Elapsed time: 1668.346997 msecs" (time (dotimes [_ 10000000] (object-array (rseq [1])))) ;"Elapsed time: 662.820591 msecs" After: (time (dotimes [_ 10000000] (object-array [1]))) ;"Elapsed time: 757.084577 msecs" (time (dotimes [_ 10000000] (object-array (rseq [1])))) ;"Elapsed time: 680.602921 msecs" |
| Comment by Stuart Halloway [ 19/Oct/12 1:46 PM ] |
|
Two patches to be applied together, the 10/19 patch adds tests and updates to latest test.generative. |