ruby-changes:61916
From: Takashi <ko1@a...>
Date: Wed, 24 Jun 2020 15:49:19 +0900 (JST)
Subject: [ruby-changes:61916] 946e5cc668 (master): Annotate Kernel#class as inline (#3250)
https://git.ruby-lang.org/ruby.git/commit/?id=946e5cc668 From 946e5cc668f66a4a0b79461047d3fcba8b71eef0 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun <takashikkbn@g...> Date: Tue, 23 Jun 2020 23:49:03 -0700 Subject: Annotate Kernel#class as inline (#3250) ``` $ benchmark-driver -v --rbenv 'before;after;before --jit;after --jit' benchmark/mjit_class.yml --repeat-count=4 before: ruby 2.8.0dev (2020-06-23T07:09:54Z master 37a2e48d76) [x86_64-linux] after: ruby 2.8.0dev (2020-06-23T17:29:56Z inline-class 0ff147c007) [x86_64-linux] before --jit: ruby 2.8.0dev (2020-06-23T07:09:54Z master 37a2e48d76) +JIT [x86_64-linux] after --jit: ruby 2.8.0dev (2020-06-23T17:29:56Z inline-class 0ff147c007) +JIT [x86_64-linux] Calculating ------------------------------------- before after before --jit after --jit mjit_class(self) 39.219M 40.060M 53.502M 69.202M i/s - 40.000M times in 1.019915s 0.998495s 0.747631s 0.578021s mjit_class(1) 39.567M 41.242M 52.100M 68.895M i/s - 40.000M times in 1.010935s 0.969885s 0.767749s 0.580591s Comparison: mjit_class(self) after --jit: 69201690.7 i/s before --jit: 53502336.4 i/s - 1.29x slower after: 40060289.1 i/s - 1.73x slower before: 39218939.2 i/s - 1.76x slower mjit_class(1) after --jit: 68895358.6 i/s before --jit: 52100353.0 i/s - 1.32x slower after: 41241993.6 i/s - 1.67x slower before: 39567314.0 i/s - 1.74x slower ``` diff --git a/benchmark/mjit_class.yml b/benchmark/mjit_class.yml new file mode 100644 index 0000000..22f95c2 --- /dev/null +++ b/benchmark/mjit_class.yml @@ -0,0 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/benchmark/mjit_class.yml#L1 +type: lib/benchmark_driver/runner/mjit +prelude: | + def mjit_class(obj) + obj.class + end + +benchmark: + - mjit_class(self) + - mjit_class(1) + +loop_count: 40000000 diff --git a/benchmark/mjit_send_cfunc.yml b/benchmark/mjit_send_cfunc.yml deleted file mode 100644 index 8caa62c..0000000 --- a/benchmark/mjit_send_cfunc.yml +++ /dev/null @@ -1,7 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/benchmark/mjit_class.yml#L0 -type: lib/benchmark_driver/runner/mjit -prelude: | - def mjit_send_cfunc - self.class - end -benchmark: mjit_send_cfunc -loop_count: 100000000 diff --git a/common.mk b/common.mk index 6f829c9..8438089 100644 --- a/common.mk +++ b/common.mk @@ -8514,6 +8514,7 @@ mjit_compile.$(OBJEXT): $(top_srcdir)/internal/compilers.h https://github.com/ruby/ruby/blob/trunk/common.mk#L8514 mjit_compile.$(OBJEXT): $(top_srcdir)/internal/gc.h mjit_compile.$(OBJEXT): $(top_srcdir)/internal/hash.h mjit_compile.$(OBJEXT): $(top_srcdir)/internal/imemo.h +mjit_compile.$(OBJEXT): $(top_srcdir)/internal/object.h mjit_compile.$(OBJEXT): $(top_srcdir)/internal/serial.h mjit_compile.$(OBJEXT): $(top_srcdir)/internal/static_assert.h mjit_compile.$(OBJEXT): $(top_srcdir)/internal/variable.h @@ -9266,6 +9267,7 @@ object.$(OBJEXT): {$(VPATH)}internal/value_type.h https://github.com/ruby/ruby/blob/trunk/common.mk#L9267 object.$(OBJEXT): {$(VPATH)}internal/variable.h object.$(OBJEXT): {$(VPATH)}internal/warning_push.h object.$(OBJEXT): {$(VPATH)}internal/xmalloc.h +object.$(OBJEXT): {$(VPATH)}kernel.rb object.$(OBJEXT): {$(VPATH)}kernel.rbinc object.$(OBJEXT): {$(VPATH)}missing.h object.$(OBJEXT): {$(VPATH)}object.c diff --git a/kernel.rb b/kernel.rb index e7d955f..d00ba3a 100644 --- a/kernel.rb +++ b/kernel.rb @@ -1,6 +1,27 @@ https://github.com/ruby/ruby/blob/trunk/kernel.rb#L1 module Kernel # # call-seq: + # obj.class -> class + # + # Returns the class of <i>obj</i>. This method must always be called + # with an explicit receiver, as #class is also a reserved word in + # Ruby. + # + # 1.class #=> Integer + # self.class #=> Object + #-- + # Equivalent to \c Object\#class in Ruby. + # + # Returns the class of \c obj, skipping singleton classes or module inclusions. + #++ + # + def class + Primitive.attr! 'inline' + Primitive.cexpr! 'rb_obj_class(self)' + end + + # + # call-seq: # obj.clone(freeze: nil) -> an_object # # Produces a shallow copy of <i>obj</i>---the instance variables of diff --git a/object.c b/object.c index dafbcd0..03cc51a 100644 --- a/object.c +++ b/object.c @@ -291,22 +291,6 @@ rb_class_real(VALUE cl) https://github.com/ruby/ruby/blob/trunk/object.c#L291 return cl; } -/** - * call-seq: - * obj.class -> class - * - * Returns the class of <i>obj</i>. This method must always be called - * with an explicit receiver, as #class is also a reserved word in - * Ruby. - * - * 1.class #=> Integer - * self.class #=> Object - *-- - * Equivalent to \c Object\#class in Ruby. - * - * Returns the class of \c obj, skipping singleton classes or module inclusions. - *++ - */ VALUE rb_obj_class(VALUE obj) { @@ -4606,7 +4590,6 @@ InitVM_Object(void) https://github.com/ruby/ruby/blob/trunk/object.c#L4590 rb_define_method(rb_mKernel, "hash", rb_obj_hash, 0); /* in hash.c */ rb_define_method(rb_mKernel, "<=>", rb_obj_cmp, 1); - rb_define_method(rb_mKernel, "class", rb_obj_class, 0); rb_define_method(rb_mKernel, "singleton_class", rb_obj_singleton_class, 0); rb_define_method(rb_mKernel, "dup", rb_obj_dup, 0); rb_define_method(rb_mKernel, "itself", rb_obj_itself, 0); -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/