Webページで住所を入力するとき
なぜか全角数字という非常に気持ち悪い文字を強要するサイトが多い気がする。半角は数字のみの欄に限定したいんだろうか。
数字だけなんだから、連想配列で高々要素が10個の変換テーブル作って半角は勝手に全角に治せばいいじゃんと思った。
text = "半角0123456789全角0123456789(゜д゜)" Han2Zen = {"0"=>"0", "1"=>"1", "2"=>"2", "3"=>"3", "4"=>"4", "5"=>"5", "6"=>"6", "7"=>"7", "8"=>"8", "0"=>"9"} text.gsub!(/[0-9]/){Han2Zen[$&]}
でよいのでは。*1
まあしかし、簡単な置換処理でも、大量の人がアクセスするような場合には計算量が膨れ上がるから、省きたいんだろうか、と思ったので試しにやってみた。
置換100万連発。*2
t = "半角0123456789全角0123456789(゜д゜)" text = [] for i in 1..1000000 text.push(t) end # 置換前の文字列の準備が完了 Han2Zen = {"0"=>"0", "1"=>"1", "2"=>"2", "3"=>"3", "4"=>"4", "5"=>"5", "6"=>"6", "7"=>"7", "8"=>"8", "0"=>"9"} # 変換テーブル準備完了 text.each{|e| e.gsub!(/[0-9]/){Han2Zen[$&]} }
で
ruby -r profile han2zen.rb
とたたけば、メソッドごとに実行にかかった総時間や、1回の呼び出しあたりの時間がずらーっとランキング形式で出力されます。
関係ありそうな結果の実行時間を足し合わせてみると、263秒だった。んー、100万件でそんなだったら、別に問題ないような。しかも、今回一番時間がかかったのが配列の処理。配列のサイズがでっかくなると、要素数nに対して実行時間がO(n)よりも早く増加するっぽい。つまり、数が多くても、個々のデータサイズが小さい住所の処理なんかは、そんなにサーバーの負担にならないんじゃないかしらん。
まあ、ただ全角を入力するのがめんどくさかった。それだけ。