As you can see here, accessing elements of nested subvectors is slow.
user> (doseq [i (map #(Math/pow 2 %) (range 0 16))]
(print i " ")
(let [sub (nth (iterate #(subvec % 0 1) [1]) i)]
(time (dotimes [_ 10000] (sub 0)))))
1.0 "Elapsed time: 1.929 msecs"
...
128.0 "Elapsed time: 7.477 msecs"
...
32768.0 "Elapsed time: 10342.465 msecs"
It seems the speed hit can be avoided by adding a special case to the
SubVector constructor in APersistentVector.java:
public SubVector(IPersistentMap meta, IPersistentVector v, int start,
int end){
super(meta);
if (v instanceof SubVector) {
SubVector s = (SubVector)v
this.v = s.v;
this.start = start + s.start;
this.end = end + s.start;
} else {
this.v = v;
this.start = start;
this.end = end;
}
}
I've tested this a bit and it appears to work properly. Does this
seem like a good idea?
-Jason
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---