Profiling C
perf
https://www.brendangregg.com/perf.html
https://perf.wiki.kernel.org/index.php/Main_Page
Slide 14
Slide 14 text
No content
Slide 15
Slide 15 text
No content
Slide 16
Slide 16 text
rb_define_method(rb_mKernel, "kind_of?", rb_obj_is_kind_of, 1);
rb_define_method(rb_mKernel, "is_a?", rb_obj_is_kind_of, 1);
rb_obj_is_kind_of
src/ruby/object.c
VALUE rb_obj_is_kind_of(VALUE obj, VALUE c);
Slide 17
Slide 17 text
bool rb_obj_is_kind_of(VALUE obj, VALUE search) {
return class_search_ancestor(CLASS_OF(obj), search);
}
Slide 18
Slide 18 text
bool class_search_ancestor(VALUE cl, VALUE search) {
while (cl) {
if (cl == c) return true;
cl = RCLASS_SUPER(cl);
}
return false;
}
bool rb_obj_is_kind_of(VALUE obj, VALUE search) {
return class_search_ancestor(CLASS_OF(obj), search);
}
Slide 19
Slide 19 text
def class_search_ancestor(klass, search)
while klass
return true if klass == search
klass = klass.superclass
end
false
end
def rb_obj_is_kind_of(obj, search)
class_search_ancestor(obj.class, search)
end
Slide 20
Slide 20 text
Butter
fl
y
Object
BasicObject
Pidgeon
Slide 21
Slide 21 text
Butter
fl
y
Object
BasicObject
Pidgeon
Slide 22
Slide 22 text
Butter
fl
y
Object
BasicObject Pidgeon
Slide 23
Slide 23 text
Butter
fl
y
Object
BasicObject
Slide 24
Slide 24 text
Butter
fl
y
Object
BasicObject
Slide 25
Slide 25 text
Butter
fl
y
Object
BasicObject
ICLASS
ICLASS
Slide 26
Slide 26 text
Butter
fl
y
Object
BasicObject
ICLASS
ICLASS
Slide 27
Slide 27 text
Butter
fl
y
Object
PP::ObjectMixin
Kernel
BasicObject
ICLASS
ICLASS
Slide 28
Slide 28 text
rb_obj_is_kind_of(obj, klass)
def class_search_superclass(klass, search)
while klass
return true if klass == search
klass = klass.superclass
end
false
end
def rb_obj_is_kind_of(obj, search)
class_search_superclass(obj.class, search)
end
Slide 29
Slide 29 text
rb_obj_is_kind_of(obj, klass)
def class_search_superclass(klass, search)
while klass
return true if klass == search
klass = klass.superclass
end
false
end
def rb_obj_is_kind_of(obj, search)
class_search_superclass(obj.class, search)
end
ObjectSpace.internal_super_of
ObjectSpace.internal_class_of
Slide 30
Slide 30 text
rb_obj_is_kind_of(obj, klass)
def class_search_superclass(klass, search)
while klass
return true if klass == search
klass = ObjectSpace.internal_super_of(klass)
end
false
end
def rb_obj_is_kind_of(obj, search)
class_search_superclass(ObjectSpace.internal_class_of(class), sea
end
Slide 31
Slide 31 text
Butter
fl
y
Object
PP::ObjectMixin
Kernel
BasicObject
ICLASS
ICLASS
CPU 😢
• cache lines
• branch prediction