Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

リテラル系記述を何度も呼び出す場合は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