1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/benchmark/module_eqq.yml
John Hawthorn b13a7c8e36 Constant time class to class ancestor lookup
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.
2022-02-23 19:57:42 -08:00

27 lines
676 B
YAML

prelude: |
class SimpleClass; end
class MediumClass
10.times { include Module.new }
end
class LargeClass
100.times { include Module.new }
end
class HugeClass
300.times { include Module.new }
end
SimpleObj = SimpleClass.new
MediumObj = MediumClass.new
LargeObj = LargeClass.new
HugeObj = HugeClass.new
benchmark:
simple_class_eqq_simple_obj: |
SimpleClass === SimpleObj
medium_class_eqq_simple_obj: |
MediumClass === SimpleObj
simple_class_eqq_medium_obj: |
SimpleClass === MediumObj
simple_class_eqq_large_obj: |
SimpleClass === LargeObj
simple_class_eqq_huge_obj: |
SimpleClass === HugeObj
loop_count: 20000000