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 clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to