2014年11月25日火曜日

【ruby】文字列の置換をgsubで複数条件繰り返す場合、条件をhashで指定するとどのくらい早いのか。

gsubで文字列置換をするとき、複数組の置換をする場合、メソッドチェーンでgsubをつなげて書くこともできる。
一方組みをhashで渡して1つのgsubで書くこともできる。つどはじめのstringを全部検索しない分hashで渡すほうが
はやいはずだけどどれほど違うのかと気になった。

それぞれ下記のようなコードで50万回のループをまわす。


サンプルA

# coding:utf-8

str = "aaaaabbbbbbcccccc"

500000.times do | i |
str.gsub( /aaa/, 'AAA' ).
gsub( /bbb/, 'BBB' ).
gsub( /ccc/, 'CCC' ).
gsub( /ddd/, 'DDD' ).
gsub( /eee/, 'EEE' ).
gsub( /fff/, 'FFF' ).
gsub( /ggg/, 'GGG' ).
gsub( /hhh/, 'HHH' ).
gsub( /iii/, 'III' )
end

ruby test.rb 4.07s user 0.00s system 99% cpu 4.080 total
ruby test.rb 4.05s user 0.00s system 99% cpu 4.066 total
ruby test.rb 4.11s user 0.00s system 99% cpu 4.125 total

 gsubをつなげるタイプでは4秒程度。

サンプルB

# coding:utf-8

str = "aaaaabbbbbbcccccc"

500000.times do | i |
str.gsub( /aaa|bbb|ccc|ddd|eee|fff|ggg|hhh|iii/, "aaa"=>"AAA", "bbb"=>"BBB","ccc"=>"CCC", "ddd"=>"DDD", "eee"=>"EEE",
"fff"=>"FFF", "ggg"=>"GGG", "hhh"=>"HHH", "iii"=>"III" )
end


ruby test.rb 3.64s user 0.00s system 99% cpu 3.656 total
ruby test.rb 3.59s user 0.00s system 99% cpu 3.604 total
ruby test.rb 3.63s user 0.01s system 99% cpu 3.643 total

 hashを使うタイプは4秒弱。

 まぁ50万回繰り返してこの程度だからたいていは気にならないレベル。
コーディングの早さ優先でたいていの場合はgsubの連続にするかな。

2014年11月16日日曜日

Railsでseedファイルを複数持ちたいとき

Railsでseedファイルを複数持ちたいとき(後でデータを追加する必要ができてときなど)、
下記のようにrakeタスクとして追加するとできる。

あとはdb/seedsディレクトリを作って、seedファイルを追加するだけ。


lib/tasks/seed.rake

# coding:utf-8

Dir.glob( File.join( Rails.root, "db", "seeds", "*.rb" ) ).each do | file |
desc "seeding data by #{file}"
task "db:seed:#{ File.basename( file, ".rb" ) }" => :environment do
load( file )
end
end