Bignumは遅いとのことで測った

10週遅れぐらいでRHGを読み始めた。

第二章の整数の説明でFixnumとBignumの内部実装の違いについて書いてある。

Rubyのオブジェクトは基本的には各々のクラスの構造体へのポインタ(RBasic.klass)を持つんだけど、効率面を考えて一部のオブジェクト*1はこのポインタ変数の領域に構造体へのポインタではなく即値を書くようにしている。Fixnumもこの場合に当てはまる。

なんで、ポインタ型のサイズにいい感じに収まる範囲ならFixnum、サイズを超える場合はBignumに勝手に切り替わる。

(正確には sizeof(unsigned long)*8-1ビットの範囲に収まる符号付き整数)

Bignumはクラス構造体を作ってポインタを持つので生成コストが高い。

最近のRubyでもそうなのかなと思って測った。

gistde49f43915b2ca6d5ae8

原因がRHGが書かれた時点のRubyと同じかはわからないけど遅かった。

*1:RHGが書かれた時点のRubyでは小さな整数、シンボル、true、false、nil、Qundef