ささだです。
rb_class_of は、殆どの場合 !SPECIAL_CONST_P(obj) な obj を検査するの
ではないかと思うので、先に SPECIAL_CONST_P(obj) などでチェックすると、
RBASIC(obj)->klass へのパスが短くなって全体が高速化されるような気がする
のですが、どうでしょうか。
(案1)
static inline VALUE
my_class_of(VALUE obj)
{
if(SPECIAL_CONST_P(obj)){
if (FIXNUM_P(obj)) return rb_cFixnum;
if (obj == Qnil) return rb_cNilClass;
if (obj == Qfalse) return rb_cFalseClass;
if (obj == Qtrue) return rb_cTrueClass;
if (SYMBOL_P(obj)) return rb_cSymbol;
}
else{
return RBASIC(obj)->klass;
}
}
(案2)
static inline VALUE
my_class_of2(VALUE obj)
{
if(IMMEDIATE_P(obj)){
if (FIXNUM_P(obj)) return rb_cFixnum;
if (obj == Qtrue) return rb_cTrueClass;
if (SYMBOL_P(obj)) return rb_cSymbol;
}
else if(!RTEST(obj)){
if (obj == Qnil) return rb_cNilClass;
if (obj == Qfalse) return rb_cFalseClass;
}
else{
return RBASIC(obj)->klass;
}
}
どれくらいの速度差が出るか少し測ったのが次のページのちょっと下にあります。
http://www.namikilab.tuat.ac.jp/~sasada/diary/200401.html#d12
rb_class_of を適用するオブジェクトの統計を取ったわけではないので、考え
違いでしたらすみません。
--
// SASADA Koichi @ namikilab.tuat.ac.jp
//