chibaqn /
Posts
2022-10-02 12:50:44

メモリ使用量の観点で文字列とシンボルを比較する

はじめに

以前(何年か前に)、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つにより実装されている。

そのため 同じシンボル(同じ文字列から作られたシンボル)を複製しても同じ要素へのポインタが使われるだけなので メモリ使用量は普通の文字列と比べて少ない。

おわりに

違いを理解して、効率の良いコードを実装することを意識したい。

参考資料