| Thread overview | |||||||
|---|---|---|---|---|---|---|---|
|
October 17, 2017 Garbage Collector profiling and the dynamic array reserve() function | ||||
|---|---|---|---|---|
| ||||
Found this unanswered question on StackOverflow.
This program:
import std.stdio;
void add(ref int[] data)
{
data ~= 1;
data ~= 2;
}
void main()
{
int[] a;
writeln("capacity:",a.capacity);
auto cap = a.reserve(1000); // allocated may be more than requested
assert(cap >= 1000);
assert(cap == a.capacity);
writeln("capacity:",a.capacity);
a.add();
writeln(a);
}
compiled with "dmd -profile=gc"
has this output in profilegc.log
bytes allocated, allocations, type, function, file:line
4 1 int[] profiling.add profiling.d:8
4 1 int[] profiling.add profiling.d:7
The question is: why doesn't using reserve() cause an allocation to be shown?
| ||||
October 17, 2017 Re: Garbage Collector profiling and the dynamic array reserve() function | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Tony | On 10/17/17 2:14 AM, Tony wrote:
> Found this unanswered question on StackOverflow.
>
> This program:
>
> import std.stdio;
>
> void add(ref int[] data)
> {
> data ~= 1;
> data ~= 2;
> }
>
> void main()
> {
> int[] a;
> writeln("capacity:",a.capacity);
> auto cap = a.reserve(1000); // allocated may be more than requested
> assert(cap >= 1000);
> assert(cap == a.capacity);
> writeln("capacity:",a.capacity);
> a.add();
> writeln(a);
>
> }
>
> compiled with "dmd -profile=gc"
>
> has this output in profilegc.log
>
> bytes allocated, allocations, type, function, file:line
> 4 1 int[] profiling.add profiling.d:8
> 4 1 int[] profiling.add profiling.d:7
>
> The question is: why doesn't using reserve() cause an allocation to be shown?
I don't know what "allocations" represents, but reserve actually calls gc_malloc, and the others do not (the space is available to expand into the block). There should be only one allocation IMO.
-Steve
| |||
October 18, 2017 Re: Garbage Collector profiling and the dynamic array reserve() function | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Tuesday, 17 October 2017 at 13:27:24 UTC, Steven Schveighoffer wrote:
>
> I don't know what "allocations" represents, but reserve actually calls gc_malloc, and the others do not (the space is available to expand into the block). There should be only one allocation IMO.
>
> -Steve
So there should be a bug report written for this?
| |||
October 18, 2017 Re: Garbage Collector profiling and the dynamic array reserve() function | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Tony | On 10/18/17 1:40 AM, Tony wrote:
> On Tuesday, 17 October 2017 at 13:27:24 UTC, Steven Schveighoffer wrote:
>
>>
>> I don't know what "allocations" represents, but reserve actually calls gc_malloc, and the others do not (the space is available to expand into the block). There should be only one allocation IMO.
>>
>
> So there should be a bug report written for this?
>
It all depends on what "allocations" means. I'd wait to find out from someone who is familiar with the GC profiling.
-Steve
| |||
October 22, 2017 Re: Garbage Collector profiling and the dynamic array reserve() function | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Wednesday, 18 October 2017 at 15:39:43 UTC, Steven Schveighoffer wrote: > On 10/18/17 1:40 AM, Tony wrote: >> On Tuesday, 17 October 2017 at 13:27:24 UTC, Steven Schveighoffer wrote: >> >>> >>> I don't know what "allocations" represents, but reserve actually calls gc_malloc, and the others do not (the space is available to expand into the block). There should be only one allocation IMO. >>> >> >> So there should be a bug report written for this? >> > > It all depends on what "allocations" means. I'd wait to find out from someone who is familiar with the GC profiling. > > -Steve I don't have a lot of clues on how the GC profiling work, but looking at reserve() it calls mem.xmalloc() for allocations which in fact calls GC.malloc(). Looking at the profiling for GC though: https://github.com/dlang/dmd/blob/69567a32c5bffae5513b41e7691c91b50766b552/src/ddmd/e2ir.d#L5952 It doesn't look like there's anything for array reserve calls, unless: [ RTLSYM_ALLOCMEMORY, RTLSYM_TRACEALLOCMEMORY ] are triggered from the allocations done in reserve(), but I have no idea about that. | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply