Rails 1.0 Performance Report (vs. 0.14.1)

Short Summary for the Impatient

Rails 1.0 performs slightly worse than the previous 0.14.1 release for my application. However, 1.0 is still much faster than the previous 0.13 release series.

The following performance data table shows the speed difference for the fastest availabe configuration for the tested application.

page c1 totalc2 total c1 r/sc2 r/s c1 ms/rc2 ms/r c1/c2
/empty/index 1.261111.40676 793.0710.9 1.261.41 0.90
/welcome/index 1.418141.57333 705.1635.6 1.421.57 0.90
/rezept/index 1.500771.66533 666.3600.5 1.501.67 0.90
/rezept/myknzlpzl 1.493741.65309 669.5604.9 1.491.65 0.90
/rezept/show/713 3.599883.99798 277.8250.1 3.604.00 0.90
/rezept/cat/Hauptspeise 4.540244.86669 220.3205.5 4.544.87 0.93
/rezept/letter/G 4.590544.84387 217.8206.4 4.594.84 0.95

The reasons for this significant slowdown have been identified and are being worked on (tickets 3155 and 3174).

Environment

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.

Configuration options

A number of configuration options were tested:

out of the box
This is of course the most natural thing to test
gc100
Manual garbage collection control: garbage collection was disabled and a collect was forced after 100 requests
patched_gc
Test with the garbage collector patch applied to ruby 1.8.2 with the following settings:
RUBY_GC_STATS=0
RUBY_HEAP_MIN_SLOTS=600000
RUBY_GC_MALLOC_LIMIT=59000000
RUBY_HEAP_FREE_MIN=100000
mysql_session
A Mysql native session class implementation
sql_bypass
A session class implementation derived from CGI::Session::ActiveRecordStore::SqlBypass
nat_routes
A hand coded routing implementation using only URLs of the form controller/action/id
routing_cache
the default routing implementation enhanced by a cache for recognized URLs
links
use link_to calls instead of specifying URLs directly

Test Data

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:

Performance Charts

Out of the box 0.14.1 vs. 1.0

This one shows how well 1.0 does against 0.14.1, with no options, gc100 and patched GC. The numbers are requests per second.

Out of the box 1.0 vs. fully optimized 1.0

This one shows the speedup of all tuning options applied to 1.0, for the different GC options.

Tuning effects on 1.0 with patched GC

This one shows the speedup obtained by applying different tuning options to 1.0, all running with patched GC.