Feature #19730
closedRemove transient heap
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) over 1 year ago
no problem.
do you have a measurements between VWA or non-VWA + transient heap?
Updated by peterzhu2118 (Peter Zhu) over 1 year 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.
Updated by peterzhu2118 (Peter Zhu) over 1 year ago
- Status changed from Open to Closed
Applied in changeset git|1e7b67f73370056c7521306b9f037b6cbccf640d.
[Feature #19730] Remove transient heap