Understanding gc memory profile report
Ali Çehreli via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Sep 8 03:09:54 PDT 2017
Although I responded below, I'm curious on what others think about this
question.
On 09/08/2017 02:13 AM, John Burton wrote:
> I wrote this simple program to test out my understanding of memory
> allocation :-
I changed it to display the location and capacity:
import std.stdio;
void info(A)(A array) {
writefln("ptr: %s, capacity: %s, length: %s",
array.ptr, array.capacity, array.length);
}
void main()
{
int [] array = new int[250];
info(array);
// Append one value to the array
array ~= 123;
info(array);
}
Sample output:
ptr: 7FD9B63CD000, capacity: 255, length: 250
ptr: 7FD9B63CD000, capacity: 255, length: 251
> I compiled it with 'dmd test.d -profile=gc'
>
> After running it, the profile report was :-
>
> bytes allocated, allocations, type, function, file:line
> 2000 1 int[] D main test.d:5
> 4 1 int[] D main test.d:10
Here's my output with v2.076.0-dirty (that really is the version :o)):
4000 1 int[] D main deneme.d:412
72 1 std.format.FormatException
std.exception.enforceEx!(FormatException).enforceEx!bool.enforceEx
/usr/include/dmd/phobos/std/exception.d:615
64 2 std.array.Appender!string.Appender.Data
std.array.Appender!string.Appender.this
/usr/include/dmd/phobos/std/array.d:2817
32 1
std.array.Appender!(char[]).Appender.Data
std.array.Appender!(char[]).Appender.this
/usr/include/dmd/phobos/std/array.d:2817
4 1 int[] D main deneme.d:417
And why is mine 4000 bytes? I guess it's the size of the underlying buffer.
> This is not how I expected it to be. I would have expected that the
> runtime either did not have to allocate at all at line 10 to add a new
> element because there was already space or it would have to allocate
> space for the new enlarged array and copy the array to it, in which case
> I'd expect it to allocate 2004 bytes (or more) to copy the enlarged
> array in to.
>
> I would not expect that it could have allocated 4 bytes to add an item
> separably from the original 2000. Is there some way that the runtime can
> grown the original allocation by 4 bytes and that's what I'm seeing? If
> so, is there a limit to how much it can do this?
>
> Can anyone help me understand what is going on here?
I think you're right. Perhaps more accurate information is not possible
with the current implementation. Perhaps a higher-layer function counts
"potential" allocations without being sure whether the space could be
used for this slice or not. The "D Slices" article has related information:
https://dlang.org/d-array-article.html
Ali
More information about the Digitalmars-d-learn
mailing list