Common performance issues

Hi,

When writing a Rails app, what common tasks can likely result in
performance issues?

The one I'm aware of is something like:
Model.find(:all).each do |elem|
  # do stuff
end

Especially when there's lots of elements in the Model. What other
ones are there?

Also, does Rails do caching of queries? If I'm in a view and I do:
<% if user.admin? %> ...

and then later on in that same view, I have the same code again, does
that execute two queries?

Joe

Another one:
What's a faster way to write:

class User < AR
  has_many :comments
  def number_of_comments
    comments.size
  end
end

(if I don't want to do caching). I assume that calling
number_of_comments creates AR objects for each comment.

Joe-

You may find it useful to use “tail” to monitor the file development.log while you are developing - each SQL query that Rails executes will show up there. I believe (though you should double check this) that calling comments.size when comments has not been loaded will do a single “select count(*)…” query without instantiating a bunch of Comment objects.

-Steve Holder

Hi

the ruby Net::HTTP library allows calls like:

    Net::HTTP.get(url.path)

end similar looking post calls,
Since the RESTful support uses
DELETE and PUT, i was wondering how to make ruby calls
like the above Net::HTTP of the kind DELETE and PUT?

Thanks in advance!
Gustav

Steve Holder wrote:

Joe-

You may find it useful to use "tail" to monitor the file
development.logwhile you are developing - each SQL query that Rails
executes will show up
there. I believe (though you should double check this) that calling
comments.size when comments has not been loaded will do a single "select
count(*)..." query without instantiating a bunch of Comment objects.

I thought that, when in development mode, Rails generates different SQL
(i.e. more SQL queries) than when in production mode.

Is this not the case?

Joe

Definitely not.

Regarding your original question, have a look at the :counter_cache
option for associations.

Michael

joevandyk@gmail.com wrote:

Hi,

When writing a Rails app, what common tasks can likely result in
performance issues?

I found this article: http://www.infoq.com/articles/Rails-Performance

May be useful to others out there.

In my applications, the logs seem to indicate that the "rendering"
part, and not the "database" part, is the bottleneck. Is ActiveRecord
work included in the database figure?

Another one: I've noticed that, if I have a couple thousand <%= ... %>
on a page, it slows down considerably. Would it be worth a try to
build up strings of html using <% str += "more" %> and then <%= str %>?

Joe

if rendering is your bottleneck, you should check this out:
http://www.railsexpress.de/blog/articles/2006/08/15/rails-template-optimizer-beta-test

ed

joevandyk wrote:

When writing a Rails app, what common tasks can likely result in
performance issues?

I noticed in the Log folder that many SELECT statements had LIMIT 1 on
the end.

We all know that's a no-no when you are _architecting_ a database. It's
mostly harmless when _using_ it...

...however, I would have relied on assertions demanding that all select
statements that only need 1 row return will only get 1 row. Without
LIMIT 1. That would imply that the database is sufficiently normal, and
the SELECT statements are sufficiently constrained.

So, in general, the ideal might be to transfer limit-checking to the
tests, so the code can run faster without it, and with proper
constraints.

(The spectre of SQL data normalization and query optimization also
raises it's ugly head. We might presume that the slowest DB operation
is still faster than the fastest Ruby page rendering cycle, no? :wink: