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)