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:
parent
fd8fa1b299
commit
c4c53310c2
3 changed files with 22 additions and 0 deletions
|
@ -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 `::`
|
||||
|
|
14
benchmark/bm_vm2_poly_singleton.rb
Normal file
14
benchmark/bm_vm2_poly_singleton.rb
Normal 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
|
2
class.c
2
class.c
|
@ -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)) {
|
||||
|
|
Loading…
Reference in a new issue