1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Copy the serial number from the super class to the singleton class

This helps hit inline method caches more frequently.  Before this
commit:

```
[aaron@TC ruby (trunk)]$ time ./ruby -v benchmark/bm_vm2_poly_singleton.rb
ruby 2.4.0dev (2016-09-12 trunk 56141) [x86_64-darwin15]

real  0m3.679s
user  0m3.632s
sys 0m0.022s
```

After this commit:

```
[aaron@TC ruby (trunk)]$ time ./ruby -v benchmark/bm_vm2_poly_singleton.rb
ruby 2.4.0dev (2016-09-12 trunk 56141) [x86_64-darwin15]
last_commit=Copy the serial number from the super class to the singleton class

real  0m2.246s
user  0m2.203s
sys 0m0.020s
```

[Feature #12364]
[ruby-core:75425]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56144 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
tenderlove 2016-09-12 15:40:09 +00:00
parent fd8fa1b299
commit c4c53310c2
3 changed files with 22 additions and 0 deletions

View file

@ -1,3 +1,9 @@
Tue Sep 13 00:39:47 2016 Aaron Patterson <tenderlove@ruby-lang.org>
* class.c (singleton_class_of): Copy superclass serial number to
singleton class. This improves singleton class IMC hit rates.
[Feature #12364] [ruby-core:75425]
Mon Sep 12 13:46:23 2016 Anton Davydov <mail@davydovanton.com>
* lib/uri/mailto.rb: Removed needless `return` and use `.`` instead of `::`

View file

@ -0,0 +1,14 @@
class C1
def m; 1; end
end
o1 = C1.new
o2 = C1.new
o2.singleton_class
i = 0
while i<6_000_000 # benchmark loop 2
o = (i % 2 == 0) ? o1 : o2
o.m; o.m; o.m; o.m; o.m; o.m; o.m; o.m
i += 1
end

View file

@ -1591,7 +1591,9 @@ singleton_class_of(VALUE obj)
klass = RBASIC(obj)->klass;
if (!(FL_TEST(klass, FL_SINGLETON) &&
rb_ivar_get(klass, id_attached) == obj)) {
rb_serial_t serial = RCLASS_SERIAL(klass);
klass = rb_make_metaclass(obj, klass);
RCLASS_SERIAL(klass) = serial;
}
if (OBJ_TAINTED(obj)) {