Project

General

Profile

Actions

Feature #19730

closed

Remove transient heap

Added by peterzhu2118 (Peter Zhu) 11 months ago. Updated 10 months ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:113899]

Description

GitHub PR: https://github.com/ruby/ruby/pull/7942

I'm proposing to remove the transient heap because Variable Width Allocation now supports all the types that were on the transient heap.

Arrays, objects, hashes, and structs were on the transient heap. After Variable Width Allocation:

  • Arrays: allocated on the transient heap for very large arrays (>78 elements) or when elements are added and is too big for embedded.
  • Objects: allocated on the transient heap for very large objects (>78 instance variables) or when new instance variables are added and is too big for embedded. However, classes store an estimate of the number of instance variables objects will have, which means that objects are usually allocated with the correct capacity.
  • Hashes: no longer on the transient heap.
  • Structs: allocated on the transient heap for very large structs (>78 elements).

As such, the cases where allocations are on the transient heap become rarer and thus no longer provide the performance benefits it once did. This is supported by the benchmark results below, where we see no performance change with the transient heap removed. However, we do see around a 5-10% decrease in memory usage for most benchmarks.

--------------  -----------  ----------  ---------  ----------------------  ----------  ---------  -------------------------  ------------------------
bench           master (ms)  stddev (%)  RSS (MiB)  no transient heap (ms)  stddev (%)  RSS (MiB)  no transient heap 1st itr  master/no transient heap
activerecord    71.9         2.4         58.2       71.9                    2.2         53.4       1.00                       1.00
chunky_png      822.7        0.2         45.7       837.0                   0.2         47.4       0.98                       0.98
erubi_rails     20.5         13.5        95.1       20.3                    13.3        90.6       1.00                       1.01
hexapdf         2525.8       0.7         173.1      2546.9                  0.8         162.4      1.00                       0.99
liquid-c        66.2         0.8         38.4       65.9                    0.2         34.3       1.01                       1.00
liquid-compile  60.2         1.7         36.6       60.4                    1.4         32.6       1.02                       1.00
liquid-render   165.0        0.2         37.2       164.7                   0.2         33.1       1.01                       1.00
mail            138.4        0.1         50.4       136.6                   0.2         46.5       1.03                       1.01
optcarrot       5232.2       0.7         62.9       5151.2                  0.7         58.6       1.00                       1.02
psych-load      2082.8       0.1         37.1       2059.4                  0.1         32.2       1.01                       1.01
railsbench      2066.2       0.1         103.6      2051.7                  0.4         99.3       1.01                       1.01
ruby-lsp        6.4          6.5         45.8       6.4                     6.2         41.4       1.01                       0.99
sequel          73.0         1.1         40.5       73.1                    1.0         36.1       1.00                       1.00
--------------  -----------  ----------  ---------  ----------------------  ----------  ---------  -------------------------  ------------------------

Updated by ko1 (Koichi Sasada) 10 months ago

no problem.

do you have a measurements between VWA or non-VWA + transient heap?

Updated by peterzhu2118 (Peter Zhu) 10 months ago

I can no longer measure non-VWA + transient heap because the the non-VWA code was removed in commit 1da2e7fca35dc697d85dd91d2572ab58d08cd3bc.

I can try for Ruby 3.2, but I don't think that will give useful data.

Actions #3

Updated by peterzhu2118 (Peter Zhu) 10 months ago

  • Status changed from Open to Closed

Applied in changeset git|1e7b67f73370056c7521306b9f037b6cbccf640d.


[Feature #19730] Remove transient heap

Actions

Also available in: Atom PDF

Like1
Like0Like0Like0