メモリ使用量の観点で文字列とシンボルを比較する
はじめに
以前(何年か前に)、Ruby の文字列とシンボルの違いについて調べたので、その内容をまとめる。
メモリ空間上での振る舞いの違い
文字列は同じ値の別のインスタンスが複数存在しうる。
irb(main):033:0> "あああ".object_id
=> 70164253320520
irb(main):034:0> "あああ".object_id
=> 70164301202980
シンボルは同じ値のインスタンスが存在しえない。
irb(main):035:0> :a.object_id
=> 737948
irb(main):036:0> :a.object_id
=> 737948
シンボルの特徴
文字列と比較して下記の特徴がある。
- 新しくインスタンスを生成しない分やや効率がよく、比較も高速。
- immutable なので内容を書き換えられる心配がない。
内部的にシンボルは「シンボルの情報を記録するテーブル」と「そのテーブルの要素を指し示すポインタ」の2つにより実装されている。
そのため 同じシンボル(同じ文字列から作られたシンボル)を複製しても同じ要素へのポインタが使われるだけなので メモリ使用量は普通の文字列と比べて少ない。
おわりに
違いを理解して、効率の良いコードを実装することを意識したい。