I cannot agree with this... Not at 100% at least. String manipulations are frequent enough to mandate some tuning if the need is obvious.
Looks to me that this is the case here. Other core fns went through rewrites to improve performance. Simplicity has nothing to do with internal implementations. If someone comes up with a better implementation while providing the same behaviours as the current str fn, then it should make it's way maybe in clojure.string. "fast-strings" ? Whatever it may be named. Luc P. > Core fns should be simple, unsurprising, and general. > > 'Improving' str may hurt simplicity, make behavior more surprising and > unexpected, and less general unless proven otherwise. > > On Sat, Mar 1, 2014 at 7:02 PM, bob <wee....@gmail.com> wrote: > > > > > Good point, Thanks a lot. > > > > Shall we improve the str fn in the core lib? From my point of view, the > > core fns should be performance sensitive. > > > > > > > > On Sunday, March 2, 2014 12:03:21 AM UTC+8, Shantanu Kumar wrote: > >> > >> > >> > >> On Saturday, 1 March 2014 15:32:41 UTC+5:30, bob wrote: > >>> > >>> Case : > >>> > >>> clojure verison: > >>> > >>> (time (dotimes [n 10000000] (str n "another word"))) ;; take about > >>> 5000msec > >>> > >>> java version > >>> > >>> long time = System.nanoTime(); > >>> > >>> for(int i=0 ; i<10000000 ;i++){ > >>> String a=i+"another word"; > >>> } > >>> System.out.println(System.nanoTime()-time); > >>> > >>> > >>> The java version take about 500 msecs, I thought it might be caused by > >>> the str implementation which is using string builder, and it might not be > >>> the best choice in the case of no much string to concat, and then I > >>> replace > >>> "another word" with 5 long strings as the parameter, however no surprise. > >>> > >>> I just wonder what make the difference, or how to find the difference. > >>> > >> > >> Others have added useful points to this thread. Java string concatenation > >> internally uses StringBuilder, so if you replace (str n "another word") > >> with the following: > >> > >> (let [sb (StringBuilder.)] > >> (.append sb n) > >> (.append sb "another word") > >> (.toString sb)) > >> > >> ..then the perf improves 1/4 to 1/3. Further, with the following tweak: > >> > >> (let [sb (StringBuilder. 20)] ; because StringBuilder allocates only 16 > >> chars by default on Oracle JRE > >> (.append sb n) > >> (.append sb "another word") > >> (.toString sb)) > >> > >> ..the perf improves from 1/3 to less than 1/2. Here we simply avoid > >> double allocation in StringBuilder. > >> > >> Other things I made sure were: > >> > >> 1. I used Criterium to measure > >> 2. I used `-server` option > >> 3. Made sure reflection warning was on > >> > >> Shantanu > >> > > -- > > 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. > > > > -- > 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. > -- Luc Prefontaine<lprefonta...@softaddicts.ca> sent by ibisMail! -- 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.