こしごぇ(B)

旧:http://d.hatena.ne.jp/koshigoeb/

Ruby の CSV.parse_line が遅いケース

改行が多いとパースに時間がかかるらしい。

どこで時間がかかっているかなど、ソースは見てない。

CSVは安定している様子。

1.8.7-p358, FasterCSV 1.5.5

# -*- coding: utf-8 -*-
require 'benchmark'
require 'rubygems'
require 'fastercsv'
require 'csv'

flat  = (1..100).to_a.map{|n| %Q|"#{Array.new(100, 'あ').join(' ')}"| }.join(',')
multi = (1..100).to_a.map{|n| %Q|"#{Array.new(100, 'あ').join("\n")}"| }.join(',')

Benchmark.bm do |b|
  b.report { 10.times{ FasterCSV.parse_line flat } }
  b.report { 10.times{ FasterCSV.parse_line multi } }
  b.report { 10.times{ CSV.parse_line flat } }
  b.report { 10.times{ CSV.parse_line multi } }
end

__END__
      user     system      total        real
  0.040000   0.000000   0.040000 (  0.035945)
171.650000   1.240000 172.890000 (172.914305)
  0.460000   0.000000   0.460000 (  0.464624)
  0.470000   0.000000   0.470000 (  0.464264)

1.9.3-p194

# -*- coding: utf-8 -*-
require 'benchmark'
require 'csv'

flat  = (1..100).map{|n| %Q|"#{Array.new(1000, 'あ').join(' ')}"| }.join(',')
multi = (1..100).map{|n| %Q|"#{Array.new(1000, 'あ').join("\n")}"| }.join(',')

Benchmark.bm do |b|
  b.report { 10.times{ CSV.parse_line flat } }
  b.report { 10.times{ CSV.parse_line multi } }
end

__END__
      user     system      total        real
   0.160000   0.000000   0.160000 (  0.164214)
  20.790000   0.020000  20.810000 ( 20.813151)