I investigated a little bit more. Seems that (into-array) is slows
things down because it seqs (un-necessarily?) that vector before
passing to clojure.lang.RT/seqToTypedArray.

I almost doubled the speed of sorted-vec by using clojure.lang.RT/
toArray:

(defn sorted-vec2
  [coll]
  (let [arr (clojure.lang.RT/toArray coll)]
    (java.util.Arrays/sort arr)
    (vec arr)))

user=>  (time(dotimes [_ 1000] (sorted-vec2 v)))
"Elapsed time: 3502.369933 msecs"

user=>  (time(dotimes [_ 1000] (sorted-vec v)))
"Elapsed time: 5874.088425 msecs"



On Jan 3, 10:29 am, Gabi <bugspy...@gmail.com> wrote:
> The sorted-vec is ~4 times faster than Clojure's sort (on my humble
> old machine):
>
> user=> (def v (vec (take 10000 (repeatedly #(rand-int 100000)))))
> #'user/v
> user=> (time(dotimes [_ 1000] (sort v)))
> "Elapsed time: 23945.682336 msecs"
> nil
> user=> (time(dotimes [_ 1000] (sorted-vec v)))
> "Elapsed time: 6030.585433 msecs"
>
> BTW we have state here (the native Java array). Is it thread safe ?
>
> On Jan 2, 11:04 pm, Meikel Brandmeyer <m...@kotka.de> wrote:
>
>
>
>
>
> > Hi,
>
> > Am 02.01.2010 um 20:17 schrieb ianp:
>
> > >> A bit uglier, but ought to be quite fast.
>
> > > Doesn't need to be that ugly, this looks OK to me at least:
>
> > > (defn sorted-vec [coll]
> > >  (doto (into-array coll)
> > >    (java.util.Arrays/sort)
> > >    (vec)))
>
> > > It'd also be possible to generalise the return type by passing in a fn
> > > to apply to the sorted array.
>
> > Unfortunately the above code does not work, because it returns the array 
> > and not the vector.
>
> > (defn sorted-vec
> >   [coll]
> >   (let [arr (into-array coll)]
> >     (java.util.Array/sort arr)
> >     (vec arr)))
>
> > How fast is vec on an array? Isn't there a LazilyPersistentVector which 
> > just wraps the array?
>
> > Sincerely
> > Meikel

-- 
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
Note that posts from new members are moderated - please be patient with your 
first post.
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