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