From: Kurt Stephens Date: 2010-03-06T09:31:10+09:00 Subject: [ruby-core:28522] Re: [Feature #905] Add String.new(fixnum) to preallocate large buffer Nikolai Weibull wrote: > On Fri, Mar 5, 2010 at 17:25, Caleb Clausen wrote: >> On 3/5/10, Yusuke ENDOH wrote: >>> 2010/3/5 Kornelius Kalnbach : > >>>> How big would the buffer size have to be for this template? >>>> >>>>

<%= link_to @record.name, @record %>

I can guarantee the lower bound of output size of this example is 7. :p ERB template rendering is one of my greatest performance issues right now. I routinely have have ERB templates that are over 80K, comprised mostly of large static chunks with a small number of dynamic chunks. For large templates with small substitutions, the cost of reallocation during concatenation is the biggest cost, thus preallocating a String buffer to lower bound of the result size of 80k is a big time and memory saver. And I am looking at other template engines (e.g. Erubis). This is a general problem with String concatenation -- ERB is only one of the cases -- consider XML generation. To top it off, String concatentation is slower in MRI > 1.8.6. String objects provides no opportunities to give hints about big they will end up. Low-level problems deserve low-level solutions. KAS