Feature #10238
opentodo: remove dependency on malloc_usable_size
Added by normalperson (Eric Wong) about 11 years ago. Updated over 1 year ago.
Description
malloc_usable_size shows up at or near the top of many profiles for me.
We should be able to use ruby_sized_xfree in more places; especially
if rb_data_type_t->dsize is defined.
One possible improvement is to allow the rb_data_type_t->dsize pointer
to be a FIXNUM, removing the need for some memsize functions.
Furthermore, over-accounting malloc-ed bytes (presumably the reason
malloc_usable_size was introduced). should be less harmful nowadays with
incremental marking.
Files
| 0001-gc.c-use-ruby_sized_xfree-in-more-places.patch (3.19 KB) 0001-gc.c-use-ruby_sized_xfree-in-more-places.patch | normalperson (Eric Wong), 05/18/2018 09:24 PM |
Updated by normalperson (Eric Wong) about 11 years ago
Actions
#1
[ruby-core:65301]
normalperson@yhbt.net wrote:
One possible improvement is to allow the rb_data_type_t->dsize pointer
to be a FIXNUM, removing the need for some memsize functions.
Something like:
http://80x24.org/spew/m/20140928022441.GA24830%40dcvr.yhbt.net.txt
16 files changed, 49 insertions(+), 146 deletions(-) \o/
Updated by nobu (Nobuyoshi Nakada) about 11 years ago
Actions
#2
[ruby-core:65303]
I'm not sure if function pointers are guaranteed to be word-aligned.
Updated by nobu (Nobuyoshi Nakada) about 11 years ago
Actions
#3
[ruby-core:65304]
If it's a Fixnum, the size should be 0 for NULL ptr.
enc_memsize seems unnecessary anyway, indeed.
Updated by normalperson (Eric Wong) about 11 years ago
Actions
#4
[ruby-core:65306]
nobu@ruby-lang.org wrote:
If it's a
Fixnum, the size should be 0 for NULLptr.
I was under the impression DATA_PTR is not NULL in nearly all cases,
but I did not check closely for all those classes.
But this patch may not be possible anyways since some platforms may have
non-word-aligned functions :<
enc_memsizeseems unnecessary anyway, indeed.
I'm a little curious about that, actually; but haven't gotten around
to investigating.
Updated by ko1 (Koichi Sasada) about 11 years ago
Actions
#5
[ruby-core:65311]
Eric Wong wrote:
malloc_usable_size shows up at or near the top of many profiles for me.
We can check the performance impact by enabling HAVE_MALLOC_USABLE_SIZE macro.
Try this program:
require 'benchmark'
Benchmark.bm{|x|
10.times{
x.report{
10_000_000.times{ '*' * 260 }
}
}
}
Results:
enable HAVE_MALLOC_USABLE_SIZE:
user system total real
3.140000 0.010000 3.150000 ( 3.144509)
3.130000 0.000000 3.130000 ( 3.132572)
3.130000 0.000000 3.130000 ( 3.138391)
3.170000 0.000000 3.170000 ( 3.169465)
3.150000 0.000000 3.150000 ( 3.160397)
3.140000 0.000000 3.140000 ( 3.134969)
3.150000 0.000000 3.150000 ( 3.150813)
3.130000 0.000000 3.130000 ( 3.134149)
3.190000 0.000000 3.190000 ( 3.196077)
3.130000 0.000000 3.130000 ( 3.132020)
disable HAVE_MALLOC_USABLE_SIZE:
user system total real
2.940000 0.010000 2.950000 ( 2.965000)
2.950000 0.000000 2.950000 ( 2.953580)
2.940000 0.000000 2.940000 ( 2.952080)
2.970000 0.000000 2.970000 ( 2.964060)
2.970000 0.000000 2.970000 ( 2.970614)
3.020000 0.000000 3.020000 ( 3.023180)
3.000000 0.000000 3.000000 ( 3.006568)
3.000000 0.000000 3.000000 ( 2.993302)
2.940000 0.000000 2.940000 ( 2.951028)
2.980000 0.000000 2.980000 ( 2.987452)
(Ubuntu 14.1 on VirtualBox on Windows7)
It seems about 3.1 sec ->2.9 sec (7% speedup) by disabling this feature for an intentional case.
We should be able to use ruby_sized_xfree in more places; especially
if rb_data_type_t->dsize is defined.One possible improvement is to allow the rb_data_type_t->dsize pointer
to be a FIXNUM, removing the need for some memsize functions.
T_DATA is not so many, so that I don't think the overhead of calling function is matter.
BTW, as nobu said, the function pointers can be located odd address. I encounterd such case on mswin32 build.
Furthermore, over-accounting malloc-ed bytes (presumably the reason
malloc_usable_size was introduced). should be less harmful nowadays with
incremental marking.
At first, the purpose of using malloc_usable_size() is to measure malloc'ed block correctly.
As you know, malloc() can return bigger memory block than we specified.
We need to compare the advantage (preciseness) and the disadvantage (performance down).
And I also agree that performance is more important :)
Current malloc_increase (and oldmalloc_increase) is not considered carefully.
(Current implementation is ad-hoc)
We need to re-consider about it (include avoiding atomic operations).
Updated by normalperson (Eric Wong) over 7 years ago
Actions
#6
[ruby-core:87177]
- File 0001-gc.c-use-ruby_sized_xfree-in-more-places.patch 0001-gc.c-use-ruby_sized_xfree-in-more-places.patch added
work-in-progress patch to gc.c (much more todo)
Updated by shyouhei (Shyouhei Urabe) about 6 years ago
Actions
#7
[ruby-core:94897]
Bump. I would like to revisit this. Do we need this many call to malloc_usable_size()?
Updated by ko1 (Koichi Sasada) about 6 years ago
Actions
#8
[ruby-core:95363]
It should be fixed.
Updated by ko1 (Koichi Sasada) almost 5 years ago
Actions
#9
[ruby-core:101374]
- Assignee set to ko1 (Koichi Sasada)
- Target version deleted (
3.0)
Updated by hsbt (Hiroshi SHIBATA) over 1 year ago
Actions
#10
- Status changed from Open to Assigned