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