2015-09-15

Ruby で文字連結

Ruby で文字連結するにはいくつかのやり方があって、その方式によりパフォーマンスが違うと Qiita の記事を読んで知った。

str = 'abc' + 'def'

良く使う String#+ は、結合する文字列のサイズを求め、メモリー領域を確保するという。

str = 'abc' << 'def'

他方、String#<< (String#concat) は文字列 'abc' に後続文字列を足してゆく (メモリー破壊的)。メモリー領域の確保はメソッド実行時毎ではなく、足りなくなった時にだけ行なわれる。メモリー確保量は今の「倍」という。

String#<< の方が、String#+ より効率がいい。

使ってみた

こんなメソッドを書いていた。

def foo(key,value)
  return key +' = ' + value + "\n"
end

これを String#<< で書き直してみた。

def foo(key,value)
  return key << ' = ' << value << "\n"
end

すると、こんなエラーが出た。

can't modify frozen String (RuntimeError)

そういえば、String#<< は破壊的メソッドなんだった。コードをこんな感じで直してみた。

def foo(key,value)
  return "" << key << ' = ' << value << "\n"
end

これで解決。

このコードで本当に速くなっているのかな? 記事を書いてたら自信がなくなってきた。プロファイルを取ってみたいな。

No comments:

Post a Comment