We have worked hard on making Rails 1.1 perform on the same level as Rails 1.0. This goal has been achieved and in some cases we have improved performance significantly.
The following performance data table shows the speed difference for the fastest availabe configuration for the tested application.
page c1 total c2 total c1 r/s c2 r/s c1 ms/r c2 ms/r c1/c2 /empty/index 7.86139 7.10545 636.0 703.7 1.57 1.42 1.11 /welcome/index 8.38743 8.32744 596.1 600.4 1.68 1.67 1.01 /rezept/index 8.87038 8.75717 563.7 571.0 1.77 1.75 1.01 /rezept/myknzlpzl 8.86172 8.76325 564.2 570.6 1.77 1.75 1.01 /rezept/show/713 22.22530 20.12046 225.0 248.5 4.45 4.02 1.10 /rezept/cat/Hauptspeise 25.29051 24.70123 197.7 202.4 5.06 4.94 1.02 /rezept/cat/Hauptspeise?page=5 25.92528 25.40904 192.9 196.8 5.19 5.08 1.02 /rezept/letter/G 25.06242 24.96315 199.5 200.3 5.01 4.99 1.00
Each test was run using railsbench on an Athlon64 3000+ with 1G of memory using Suse9.3, ruby 1.8.2 and Mysql 4.1, with RAILS_PERF_RUNS=5. For session storage, Mysql using mysql-ruby-2.7 was employed and Rails logging was disabled.
A number of configuration options were tested:
For the tests, I selected a number of pages from my recipe database application:
/empty/index | a simple render_text |
/welcome/index | a welcome page, action cached |
/rezept/index | application front page, user dependent, action cached |
/rezept/myknzlpzl | my recipes, user dependent, action cached |
/rezept/show/713 | show recipe 713 |
/rezept/cat/Hauptspeise | show all recipes of category Hauptspeise, paginated |
/rezept/cat/Hauptspeise?page=5 | page 5 of category Hauptspeise |
/rezept/letter/G | all recipes with a title starting with G |
Performance data for each configuration can be found here.
One on one comparisons produced by script perf_comp for each configuration are listed in this file.
Logs of the the test runs:
If you're interested in profiler output for some of the benchmarks, study call trees and call graphs here.
This one shows how well 1.1 does out of the box against 1.0, with no options, gc100 and patched GC. The numbers are requests per second.
This one shows the speedup of all tuning options applied to 1.1, for the different GC options.
This one shows the speedup obtained by applying different tuning options to 1.1, all running with patched GC.
This one shows how well 1.1 does against 1.0, with no options, gc100 and patched GC, with all tuning options applied.
If you study the charts carefully, and look at the performance numbers for the default Ruby garbage collector, you will discover that sometimes 1.1 performance is worse than 1.0 performance and sometimes better. Contrast this with the numbers for 1.1 obtained with the patched garbage collector, which are always equal or better than 1.0 numbers. This clearly shows that in order to obtain reliable performance data the patched GC should be used. The reasons are explained here. Note: I will update the patch with a newer version in a few days, so refrain from downloading the patch right now.