Revised my benchmarking script a bit to account for more content in the page part and to benchmark the existing Page#part method, which I postulated was slower than just an Array#find but then didn't include in the test.

http://gist.github.com/138062

37.5576130 Page#part(name) on a large set of parts using Array#any? + SQL find (existing part method)
14.4872570 Page#part(name) on a large set of parts using SQL find
13.9826950 Page#part(name) on a large set of parts using array find
1.3265300 Page#part(name) on a small set of parts using Array#any? + SQL find (existing part method)
1.2686400 Page#part(name) on a small set of parts using SQL find
0.0311450 Page#part(name) on a small set of parts using array find


Begin forwarded message:

From: Jason Garber <j...@jasongarber.com>
Date: June 30, 2009 4:19:46 AM EDT
To: radiant@radiantcms.org
Cc: Sean Cribbs <seancri...@gmail.com>
Subject: Re: [Radiant] a question for Page part(name) method

Having just spent a few hours in those methods (upgrading Chronicle to 0.8.0), I can speak to your question as it relates to 0.8.0. Page#parts is an ActiveRecord association: it loads all the PageParts that belong to that page into an array and then just uses that array from then on unless you do a find or a count, at which point it goes back to the database to respond to your find/count. This is important because if you create a new part (through parts.build or parts_attributes=), it just gets added to that array and ultimately saved to the database when you save the page. Thus, if the page and all its parts are not new records, the instantiated page/parts should match what's in the database and a SQL find should be faster than an Array find. If there were any new records, though, they would not be in the database, so your part(name) would miss them.

Your question raises an interesting point, though: If we're already doing an any? on the parts, why would the SQL query be any faster than Array#find? I did a little benchmarking...
http://gist.github.com/138062 (run with  -f profile)

SQLite3:
10.3987880 Page#part(name) on a large set of parts using SQL find
6.5138080 Page#part(name) on a small set of parts using SQL find
4.0115610 Page#part(name) on a large set of parts using array find
0.1251080 Page#part(name) on a small set of parts using array find

MySQL (on a slower machine):
32.3944890 Page#part(name) on a large set of parts using SQL find
17.4200660 Page#part(name) on a small set of parts using SQL find
13.0136880 Page#part(name) on a large set of parts using array find
0.5342530 Page#part(name) on a small set of parts using array find

Sean, does what I'm measuring make sense? Any reason we shouldn't just switch completely to Array#find for the Page#part method?

Jason

On Jun 29, 2009, at 5:04 AM, Quake Wang wrote:

Hi,
I found that the "part(name)" method of Page model generating many
sql query in development env, I'm curious to know why we need to check
new_record for Page and its parts?

Regards,
Quake
_______________________________________________
Radiant mailing list
Post:   Radiant@radiantcms.org
Search: http://radiantcms.org/mailing-list/search/
Site:   http://lists.radiantcms.org/mailman/listinfo/radiant


_______________________________________________
Radiant mailing list
Post:   Radiant@radiantcms.org
Search: http://radiantcms.org/mailing-list/search/
Site:   http://lists.radiantcms.org/mailman/listinfo/radiant

Reply via email to