From 946e5cc668f66a4a0b79461047d3fcba8b71eef0 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Tue, 23 Jun 2020 23:49:03 -0700 Subject: [PATCH] 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 ``` --- benchmark/mjit_class.yml | 11 +++++++++++ benchmark/mjit_send_cfunc.yml | 7 ------- common.mk | 2 ++ kernel.rb | 21 +++++++++++++++++++++ object.c | 17 ----------------- 5 files changed, 34 insertions(+), 24 deletions(-) create mode 100644 benchmark/mjit_class.yml delete mode 100644 benchmark/mjit_send_cfunc.yml diff --git a/benchmark/mjit_class.yml b/benchmark/mjit_class.yml new file mode 100644 index 0000000000..22f95c2d4d --- /dev/null +++ b/benchmark/mjit_class.yml @@ -0,0 +1,11 @@ +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 8caa62ce81..0000000000 --- a/benchmark/mjit_send_cfunc.yml +++ /dev/null @@ -1,7 +0,0 @@ -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 6f829c9a4d..8438089272 100644 --- a/common.mk +++ b/common.mk @@ -8514,6 +8514,7 @@ mjit_compile.$(OBJEXT): $(top_srcdir)/internal/compilers.h 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 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 e7d955fe45..d00ba3a809 100644 --- a/kernel.rb +++ b/kernel.rb @@ -1,4 +1,25 @@ module Kernel + # + # call-seq: + # obj.class -> class + # + # Returns the class of obj. 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 diff --git a/object.c b/object.c index dafbcd0531..03cc51a473 100644 --- a/object.c +++ b/object.c @@ -291,22 +291,6 @@ rb_class_real(VALUE cl) return cl; } -/** - * call-seq: - * obj.class -> class - * - * Returns the class of obj. 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) 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);