[#99002] [Ruby master Feature#17004] Provide a way for methods to omit their return value — shyouhei@...

Issue #17004 has been reported by shyouhei (Shyouhei Urabe).

21 messages 2020/07/01

[#99044] [Ruby master Bug#17007] SystemStackError when using super inside Module included and lexically inside refinement — eregontp@...

Issue #17007 has been reported by Eregon (Benoit Daloze).

7 messages 2020/07/03

[#99078] [Ruby master Feature#17016] Enumerable#scan_left — finch.parker@...

Issue #17016 has been reported by parker (Parker Finch).

42 messages 2020/07/07

[#99079] [Ruby master Bug#17017] Range#max & Range#minmax incorrectly use Float end as max — bosticko@...

Issue #17017 has been reported by sambostock (Sam Bostock).

25 messages 2020/07/07

[#99097] [Ruby master Bug#17021] "arm64" and "arm" are mixed in RbConfig on Apple silicon — watson1978@...

Issue #17021 has been reported by watson1978 (Shizuo Fujita).

9 messages 2020/07/09

[#99115] [Ruby master Bug#17023] How to prevent String memory to be relocated in ruby-ffi — larskanis@...

Issue #17023 has been reported by larskanis (Lars Kanis).

22 messages 2020/07/10

[#99156] [Ruby master Bug#17030] Enumerable#grep{_v} should be optimized for Regexp — marcandre-ruby-core@...

Issue #17030 has been reported by marcandre (Marc-Andre Lafortune).

25 messages 2020/07/13

[#99257] [Ruby master Misc#17041] DevelopersMeeting20200826Japan — mame@...

Issue #17041 has been reported by mame (Yusuke Endoh).

18 messages 2020/07/22

[#99308] [Ruby master Feature#17047] Support parameters for MAIL FROM and RCPT TO — bugs.ruby-lang.org@...

Issue #17047 has been reported by c960657 (Christian Schmidt).

11 messages 2020/07/23

[#99311] [Ruby master Bug#17048] Calling initialize_copy on live modules leads to crashes — XrXr@...

Issue #17048 has been reported by alanwu (Alan Wu).

17 messages 2020/07/24

[#99351] [Ruby master Bug#17052] Ruby with LTO enabled on {aarch64, ppc64le} architectures. — v.ondruch@...

Issue #17052 has been reported by vo.x (Vit Ondruch).

35 messages 2020/07/27

[#99375] [Ruby master Feature#17055] Allow suppressing uninitialized instance variable and method redefined verbose mode warnings — merch-redmine@...

Issue #17055 has been reported by jeremyevans0 (Jeremy Evans).

29 messages 2020/07/28

[#99391] [Ruby master Feature#17059] epoll as IO.select — dsh0416@...

Issue #17059 has been reported by dsh0416 (Delton Ding).

18 messages 2020/07/29

[#99418] [Ruby master Feature#17097] `map_min`, `map_max` — sawadatsuyoshi@...

Issue #17097 has been reported by sawa (Tsuyoshi Sawada).

11 messages 2020/07/31

[ruby-core:99159] [Ruby master Feature#16984] Remove write barrier examption for T_ICLASS

From: XrXr@...
Date: 2020-07-13 21:51:32 UTC
List: ruby-core #99159
Issue #16984 has been updated by alanwu (Alan Wu).

Description updated

Edit: I noticed that T_ICLASS wasn't marking the shared method and constant table on master. My notes
about reducing the number of `gc_mark` references on the heap was incorrect.



----------------------------------------
Feature #16984: Remove write barrier examption for T_ICLASS
https://bugs.ruby-lang.org/issues/16984#change-86537

* Author: alanwu (Alan Wu)
* Status: Open
* Priority: Normal
----------------------------------------
Consider the following code:

```ruby
module M
  def foo; end
  def bar; end
end

class C
  include M
end
```

The object reference graph from running the code looks like this:

```
+---+              +-----+
| M |--------------| foo |-+
+---+              +-----+ |
  |                +-----+ |
  +----------------| bar | |
                   +-----+ |
+-----------+         |    |
| iclass(M) |---------+    |
+-----------+--------------+
```

Applying the proposed patch, the graph becomes

```
+---+         +--------------+   +-----+
| M |---------| method table |---| foo |
+---+         +--------------+   +-----+
+-----------+         |    |     +-----+
| iclass(M) |---------+    +-----| bar |
+-----------+                    +-----+

```

This change has a similar effect on the constant table. In addition to this, T_ICLASS no longer
holds a reference to a ivar table. Code that access the ivar table through iclasses
are changed to access it through the object from which the iclass was made. This change
impacts autoload and class variable lookup.

## Why?

The main goal of this change is to make iclasses and modules write barrier protected. At the moment, they are
"shady", which means the GC has to do extra work to handle them. In code bases that use modules a lot,
iclasses can easily take up a significant portion of the heap and impact GC time. Inserting write barriers was
tricky in the old setup, because of the way `M` and `iclass(M)` share the method table.

Having write barrier for iclasses mean they can age in the generational GC.
Once aged, the GC can sometimes skip subgraphs rooted at these objects, improving performance.

## Impact to GC time

I measured the impact to minor GC time with the following steps:
 - load an application
 - run `GC::Profile.enable`
 - allocate 50 million objects
 - run `GC::Profile.report`

Here is the impact to average minor GC time on various apps:

|Application             |     Before    |  After  | Speedup ratio |
|------------------------|---------------|---------|---------------|
|CRuby's test-all suite  |  2.438ms      | 2.289ms |   1.06        |
|`rails new` app         |  1.911ms      | 1.798ms |   1.06        |
|Private app A           |  5.182ms      | 5.168ms |   1.00        |
|Private app B           |  185.7ms      | 107.9ms |   1.72        |

Private app A's heap size is about 22 MiB compared to B's 250 MiB.
App B boots up about 15% faster with this change.

## Impact to class variable lookup

I included a benchmark in the patch to measure the impact to class variable lookup performance.
The difference seems negligible.

## Conclusion

This change seems to reduce minor GC time for real-world applications.


---

Code: https://github.com/ruby/ruby/pull/3238
Credits to @tenderlovemaking for coming up with the idea for this change.




-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread