ささだです。

 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
//