Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

リテラル系記述を何度も呼び出す場合はObject#freezeで定数化してしまうと幸せになれる

shuzo-kino.hateblo.jp
以前書いたこの記事。

速度面での改善を図りたい場合はObject#freezeで定数化してしまう方法が有効です。
一度定数にしてしまえば一々再生成しないのでGCにも速度にも優しくなります。
ためしに%wリテラルで生成した配列を文字列化し、大文字にするメソッドを0xffff回ぶん回す事を考えてみます。
結果は

str = %w(a b c).map(&:freeze).freeze
result = Benchmark.realtime do 0xffff.times { str.to_s.upcase} end
#=> 0.165511

result = Benchmark.realtime do 0xffff.times { %w(a b c).to_s.upcase} end
#=> 0.174324

と、5%程度の優位は出ています。

配列をfreezeする時の話

別記事にしましたshuzo-kino.hateblo.jp

参考もと

Effective Ruby

Effective Ruby