Ruby でベンチマーク計測

Javaサーブレットコンテナ、まぁ Jetty なんですけど、Jetty の HTTP サーバーとしての性能がどれくらいか分かる資料が無かったので、Rubyベンチマークを計測するスクリプトを書いてみました。ついでにサーブレットも計測しています。benchmark モジュール初挑戦。

# coding: utf-8
require "open-uri"
require "benchmark"

HTML_URL = "http://192.168.56.101:8080/helloworld/"
SERVLET_URL = HTML_URL + "hello"

# ベンチマーク対象のメソッド
def open_service(uri)
  # 指定した URI にアクセスしてレスポンスを取得するだけ
  open uri do |s|
    s.read
  end
end

# 渡したブロックを 1, 10, 100, 1000 回繰り返すのにかかる時間を計測
def do_benchmark(caption, &block)
  Benchmark.benchmark(caption + Benchmark::CAPTION,
                      7,
                      Benchmark::FMTSTR) do |r|
    [1, 10, 100, 1000].each do |n|
      # block を n 回繰り返したときのベンチマーク
      r.report n.to_s do
        n.times &block
      end
    end
  end
end

# 静的ファイルにアクセス
do_benchmark("static  ") do
  open_service(HTML_URL)
end
puts

# サーブレットにアクセス
do_benchmark("servlet") do
  open_service(SERVLET_URL)
end

このスクリプトを実行した結果は次の通り。

C:\work>ruby benchmark_jetty.rb
static        user     system      total        real
1        0.078000   0.312000   0.390000 (  0.419042)
10       0.016000   0.000000   0.016000 (  0.128013)
100      0.156000   0.078000   0.234000 (  1.221122)
1000     0.764000   1.560000   2.324000 ( 12.743274)

servlet      user     system      total        real
1        0.000000   0.000000   0.000000 (  0.014002)
10       0.000000   0.016000   0.016000 (  0.134013)
100      0.063000   0.156000   0.219000 (  1.281129)
1000     1.451000   0.670000   2.121000 ( 13.073307)

このスクリプトで計測したデータが、実際に役に立つかどうかは微妙ですけどね。ていうか、たぶん JMeter あたりを使って計測し直すこと間違いなし。