Skip to content
  • John Hawthorn's avatar
    b13a7c8e
    Constant time class to class ancestor lookup · b13a7c8e
    John Hawthorn authored
    Previously when checking ancestors, we would walk all the way up the
    ancestry chain checking each parent for a matching class or module.
    
    I believe this was especially unfriendly to CPU cache since for each
    step we need to check two cache lines (the class and class ext).
    
    This check is used quite often in:
    * case statements
    * rescue statements
    * Calling protected methods
    * Class#is_a?
    * Module#===
    * Module#<=>
    
    I believe it's most common to check a class against a parent class, to
    this commit aims to improve that (unfortunately does not help checking
    for an included Module).
    
    This is done by storing on each class the number and an array of all
    parent classes, in order (BasicObject is at index 0). Using this we can
    check whether a class is a subclass of another in constant time since we
    know the location to expect it in the hierarchy.
    b13a7c8e
    Constant time class to class ancestor lookup
    John Hawthorn authored
    Previously when checking ancestors, we would walk all the way up the
    ancestry chain checking each parent for a matching class or module.
    
    I believe this was especially unfriendly to CPU cache since for each
    step we need to check two cache lines (the class and class ext).
    
    This check is used quite often in:
    * case statements
    * rescue statements
    * Calling protected methods
    * Class#is_a?
    * Module#===
    * Module#<=>
    
    I believe it's most common to check a class against a parent class, to
    this commit aims to improve that (unfortunately does not help checking
    for an included Module).
    
    This is done by storing on each class the number and an array of all
    parent classes, in order (BasicObject is at index 0). Using this we can
    check whether a class is a subclass of another in constant time since we
    know the location to expect it in the hierarchy.
Loading