webrickとrackとcgi.rbでベンチマーク

札幌Ruby会議03で咳さんからrackなんて
なんで必要なの?っていう話があって、
自分の無知をさらけ出してしまったので、
webrickを利用がてら、ベンチしてみました。
まず、webrickのドキュメントを読みながら
作ってみると、

#!/usr/bin/env ruby
require 'webrick/cgi'

class MyCGI < WEBrick::CGI
  def do_GET(req, res)
    res["content-type"] = "text/plain"
    ret = "hello world\n"
    res.body = ret
  end
end

MyCGI.new.start()

これで動きます。
なんかrackと似てますね。
同じことをrackでやると、

#!/usr/bin/env ruby
require 'rack'
include Rack
 
class HelloRack
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["hello world"]]
  end
end
 
Handler::CGI.run HelloRack.new

cgi.rbでやると、

#!/usr/bin/env ruby
require 'cgi'
cgi=CGI.new
cgi.out({"type"=>"text/plain"}) do 
  "hello world"
end

となります。これらをベンチマークしてみます。
apache benchで100リクエストを25ずつ送ってみました。
1秒間にさばけるリクエスト数が、

ruby webrick rack(CGI) cgi.rb
1.8.6 34.11 71.66 116.72
1.9.3 34.91 76.36 121.67

まあこんなもんかな。cgi.rbが激速ですな。^^;
CGIだとこうなっちゃいます。
webrickはちょっと遅いのがネックかなぁ。
 
CGIだけじゃなく、FastCGIとかPassengerとかでも
webrickが動けばちょっと嬉しいかな。