log.saiias

あてにならない備忘録

Rubyのシンボル

最近「RailsによるアジャイルWebアプリケーション開発」を読みながらRailsのお勉強の最中。その中でシンボルについての説明を読んだだけだと必要性を感じなかったのですこし調べてみた。

シンボルと文字列との違い

簡単な例を乗せる。

a1="hoge"
a2="hoge"
a1==a2
=>true

a1.equal?(a2)
=>false

となります。しかしシンボルだと

b1="hoge"
b2="hoge"
b1==b2
=>true

b1.equal?(b2)
=>true

となります。

Rubyではすべてのオブジェクトはそれぞれのobject_idを持っているので、同じ文字列であっても異なるオブジェクトになってしまいます。しかしシンボルであれば同じオブジェクトを指します。文字列とobject_idが一対一に対応することによって文字列に対する処理を高速化しつつ、可読性を保つことができるのがシンボルの使い道(?)のようです。

実際にどれくらい高速化するのかのテスト(Ruby 1.9.2 Core i5 1.7HHz)
文字列の場合

100000000.times do
a1="hoge"
a2="hoge"
a1==a2
end
32.32s user 0.06s system 100% cpu 32.372 total

シンボルの場合

100000000.times do
b1=:hoge
b2=:hoge
b1==b2
end
12.06s user 0.02s system 100% cpu 12.073 total   

と簡単な例ですが文字列の比較とシンボルの比較では確かににシンボルによって割り振られた整数での比較ができるので早いことが確認できました。