RubyでFreezeを使うメリット


イミュータブルな定数を作れる

Rubyでは、定数はミュータブル。
freezeを使うことで、イミュータブルな定数を定義できる。

FOO = "foo".freeze

オブジェクトの割り当てを減らせる

freezeしておくことで、オブジェクトが都度作られることを防ぎ、Rubyアプリケーションの速度を向上させることができる。

freezeしてある文字列は、Rubyがキャッシュしてくれるため、実行都度オブジェクトが作られるといったオーバーヘッドがなくなる。

Every time you do a method call like log("foobar"), you create a new String object.

下記の例では、50%もパフォーマンスが向上していることを示している。

require 'benchmark/ips'

def noop(arg)
end

Benchmark.ips do |x|
  x.report("normal") { noop("foo") }
  x.report("frozen") { noop("foo".freeze)  }
end

# Results with MRI 2.2.2:
# Calculating -------------------------------------
#               normal   152.123k i/100ms
#               frozen   167.474k i/100ms
# -------------------------------------------------
#               normal      6.158M (± 3.3%) i/s -     30.881M
#               frozen      9.312M (± 3.5%) i/s -     46.558M

出典:
When to use freeze and frozen? in Ruby - Honeybadger Developer Blog

https://www.honeybadger.io/blog/when-to-use-freeze-and-frozen-in-ruby/

参考

When to use freeze and frozen? in Ruby - Honeybadger Developer Blog

https://www.honeybadger.io/blog/when-to-use-freeze-and-frozen-in-ruby/