routes の(記述量と)記述箇所の違いによるパフォーマンス(処理速度)テスト

下のような config/routes.rb を用意して、
routes_check の map.connect をループの上に書いたときと、
ループの下(コメントアウトされてる箇所)に書いたときで比較した。

ActionController::Routing::Routes.draw do |map|
  map.connect '/routes_check', :controller => 'routes_check', :action => 'index'

  1.upto(100) do |i|
    map.resources "route1_#{i}"
  end
#  map.connect '/routes_check', :controller => 'routes_check', :action => 'index'

  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

環境

フィルタテスト の時と同じ。

  • App Server
    • Amazon EC2: Large Instance
    • Apache: デフォルト設定
    • Ruby: 1.8.7
    • Passenger
      • RailsEnv: production
      • RailsMaxPoolSize: 30
      • RailsPoolIdleTime: 1200
    • Rails: 2.3.8
  • Request Server
    • Amazon EC2: Large Instance
    • ab (Apache Bench) でApp Serverに対してリクエス
      • 100件同時接続を5秒間続けて、どれくらいリクエストを処理できたかを見る
$ ab -c 100 -t 5 http://ec2-***.amazonaws.com/routes_check

結果

上記、abコマンドを10回実行した平均の「Complete requests*1」「Requests per second*2」を結果とした

  ループの上 ループの下
Complete requests 2225.8 1171
Requests per second 444.536 233.508

map.resources 100個は極端な例かもしれないが、
それにしても記述箇所によって想像以上に速度が違ったので、驚いた。

*1:処理できたリクエスト総数

*2:1秒間に処理したリクエスト数