Rubyでライブラリのrequireにかかる時間を計測するスクリプト

## usage: ruby -s invoke.rb [-n=1000] [command]

require 'benchmark'

n = ($n || 1000).to_i
puts "*** n=#{n}"
commands = ARGV.collect {|lib| "ruby -e nil -r #{lib}" }
commands.unshift("ruby -e nil")

Benchmark.bm(30) do |job|
  commands.each do |command|
    title = command
    job.report(title) do
      (n/10).times do
        system command; system command
        system command; system command
        system command; system command
        system command; system command
        system command; system command
      end
    end
  end
end

実行例 (MacOS X 10.6)。見れば分かるけど、ミリ秒単位はうまく計測できないようだ。

$ ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-darwin10.2.0]
$ ruby -s invoke2.rb -n=1000 erb cgi openssl yaml rexml/document
*** n=1000
                                    user     system      total        real
ruby -e nil                     0.040000   0.380000   5.080000 (  5.388027)
ruby -e nil -r erb              0.050000   0.390000   7.930000 (  8.334806)
ruby -e nil -r cgi              0.040000   0.440000  15.960000 ( 16.603249)
ruby -e nil -r openssl          0.050000   0.400000  18.750000 ( 19.486394)
ruby -e nil -r yaml             0.060000   0.460000  30.750000 ( 31.581488)
ruby -e nil -r rexml/document   0.050000   0.460000  38.750000 ( 39.970713)

opensslがかなり重いと思ってたけど、yamlやrexmlはそれよりも重いのか。yamlはextentionのくせになぜ重いんだろう?