[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]