Tried it out. user> (time (dotimes [_ 1000] (.length ^String sss))) "Elapsed time: 0.341035 msecs" user> (time (dotimes [_ 1000] (.length ^String sss))) "Elapsed time: 0.341105 msecs" user> (time (dotimes [_ 1000] (.length ^String sss))) "Elapsed time: 0.356121 msecs" user> (time (dotimes [_ 1000] (.length ^String sss))) "Elapsed time: 0.341035 msecs"
On Sun, Feb 17, 2013 at 7:51 PM, Nicola Mometto <brobro...@gmail.com> wrote: > > Try to set! *warn-on-reflection* to true and you'll find out that > there's a lot of reflection going on when using direct java interop. > > Try benchmarking (.length ^String sss) and you'll see the difference > > Geo writes: > > > I am writing an expensive algorithms in Clojure and while trying to > > optimize the code I discovered something that puzzled me. Clojure count > and > > get functions are much faster on strings than direct interop with .length > > and .charAt. On my machine I get the following: > > > > (def sss (apply str (repeat 10000000 \a))) > > > > I execute each of the following tests a few times: > > > > (time (dotimes [_ 1000] (count sss))) > > "Elapsed time: 0.56 msecs" > > "Elapsed time: 0.539 msecs" > > "Elapsed time: 0.551 msecs" > > "Elapsed time: 0.453 msecs" > > "Elapsed time: 0.612 msecs" > > > > (time (dotimes [_ 1000] (.length sss))) > > "Elapsed time: 170.819 msecs" > > "Elapsed time: 114.892 msecs" > > "Elapsed time: 10.111 msecs" > > "Elapsed time: 32.106 msecs" > > "Elapsed time: 10.803 msecs" > > > > Even after something under the hood warms up (feel free to enlighten me > :). > > .length is still significantly slower. > > > > (time (dotimes [_ 1000] (get sss (rand-int 1000)))) > > "Elapsed time: 4.651 msecs" > > "Elapsed time: 3.699 msecs" > > "Elapsed time: 3.672 msecs" > > "Elapsed time: 4.561 msecs" > > "Elapsed time: 3.742 msecs" > > > > (time (dotimes [_ 1000] (.charAt sss (rand-int 1000)))) > > "Elapsed time: 13.211 msecs" > > "Elapsed time: 14.874 msecs" > > "Elapsed time: 32.044 msecs" > > "Elapsed time: 13.849 msecs" > > "Elapsed time: 39.493 msecs" > > > > .charAt is also significantly slower than get. > > > > By replacing .length with count and .charAt with get I was able to reduce > > the running time of my algo by orders of magnitude. > > > > These results are surprising and puzzling. You'd think direct interop > with > > Java would be the faster. Can anyone venture a guess or explain what's > > going on here? > > > > -- > > -- > -- > 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 > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/groups/opt_out. > > > -- Akhil Wali # http://github.com/darth10 <https://github.com/darth10> # http://darth10.github.com -- -- 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 --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.