Rubyでベンチマークをとる

CSVで標準のとFasterCSVを比較したくてベンチマークを取ってみた。Rubyは1.8.7。

Rubyでベンチマーク

require 'csv'
require 'benchmark'
require 'rubygems'
require 'fastercsv'
@file_name = 'hoge.tsv'
@separator = "\t"
def use_default_csv
  CSV.open(@file_name, 'r', @separator) do |row|
#処理
  end
end
def use_faster_csv
  FasterCSV.foreach(@file_name, :col_sep => @separator) do |row|
#処理
  end
end
Benchmark.bm(13) do |x|
  x.report("default csv:") { use_default_csv }
  x.report("faster csv:") { use_faster_csv }
end

このbmメソッドの引数は、初見では「ベンチマークを13回走らせてその結果を得る」という意味の引数かとおもったけど、全然違って「ラベルの文字幅を指定する」というベンチマーク自体とはあんまり関係の無いもの。これにはちょっと違和感があってあまり好きではないんだけど、下記のようにラベル使って幅を揃えるには指定しないと崩れてしまう。ラベルを付けなくて良いならいらないんだけどね。

                   user     system      total        real
default csv:   2.434000   0.000000   2.434000 (  2.427000)
faster csv:    0.062000   0.000000   0.062000 (  0.064000)

これは500kbくらいのtsvファイルをオブジェクト化する処理の結果。結構違うっぽい。というか、ほんとに?というくらい違う。ちなみにRuby 1.9ではこのFasterCSVがCSVライブラリとして取り入れられたらしいので、普通に標準のCSVライブラリを使用すれば最初から早いらしい。


CSVとFasterCSVを比較する|オープンソース研究室