[Ruby] String concatenation performance in Rails partials

Tom Lianza tlianza at gmail.com
Wed Nov 29 01:13:08 PST 2006


Evan and a few others saw me working on this problem tonight, and I just
stumbled upon a development that was fairly surprising to me.

Basically, I have a chunk of HTML I want to render, say, 50 times on a page
(this is a 'search results' page).  Each of the objects looks very similar,
so I use a partial, and call it 50 times. Rails has a convenient way of
doing this:

<%=render(:partial=>'list_item', :collection=>bookmark_list)%>
(bookmark_list is an array of 50 things)--------------^

The problem is that this seemed to be taking a long time to render.  The DB
query was quick, but the rendering took 2.5 seconds per request (benchmark
of 6 consecutive requests):
    user     system      total        real
  2.270000   0.040000   2.310000 (  2.483692)
  2.230000   0.030000   2.260000 (  2.488522)
  2.230000   0.020000   2.250000 (  2.477388)
  2.250000   0.040000   2.290000 (  2.622520)
  2.250000   0.040000   2.290000 (  2.768218)
  2.270000   0.030000   2.300000 (  2.727301)

Here's the thing that's really weird - I ripped out the code I was looping
on (the ruby and html in the list_item partial) and replaced it with totally
static code - no ruby at all.  The performance was virtually *identical.*

So, on a hunch, I took that partial (about 40 lines html) and removed all of
the whitespace, so it was all on one line.  The performance changed fairly
dramatically:

     user     system      total        real
  1.500000   0.020000   1.520000 (  1.808402)
  1.470000   0.030000   1.500000 (  1.698254)
  1.470000   0.020000   1.490000 (  1.905468)
  1.460000   0.020000   1.480000 (  1.622462)
  1.500000   0.030000   1.530000 (  1.923870)
  1.490000   0.030000   1.520000 (  2.136822)

Rendering time was cut by about 1/3.

If I cut down the html so I'm rendering a tiny amount (like one short line)
the whole thing screams.  So... this really smells to me like some kind of
string concatenation problem/slowdown.  Is anyone familliar with these kinds
of issues in Ruby?  Or, might there be an issue in the Rails code?  I had
never heard any recommendations that stripping whitespace out of templates
improves performance in any way, so I feel like this kind of behavior is not
by design.

Thanks,
Tom


More information about the Ruby mailing list