[Issue 16280] New: -profile=gc wrongly reports allocation when using reserve on dynamic arrays
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Thu Jul 14 05:38:32 PDT 2016
https://issues.dlang.org/show_bug.cgi?id=16280
Issue ID: 16280
Summary: -profile=gc wrongly reports allocation when using
reserve on dynamic arrays
Product: D
Version: D2
Hardware: x86
OS: Linux
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: cpicard at openmailbox.org
When appending to dynamic arrays the GC profiler reports as many
allocations when using .reserve and when not, although the real number
of allocations is lower:
$ nl -b a test.d
1 void main()
2 {
3 import std.stdio;
4
5 int[] arr;
6 arr.reserve(50);
7 writefln("capacity: %s", arr.capacity);
8
9 immutable limit = 100;
10 foreach (i ; 0 .. limit)
11 {
12 if(append(arr, i))
13 writefln("reallocation occurred: %s", i);
14 }
15 }
16
17 bool append(ref int[] arr, int value)
18 {
19 auto before = arr.ptr;
20 arr ~= value;
21 return arr.ptr !is before;
22 }
$ dmd -profile=gc -run test.d ; cat profilegc.log
capacity: 63
reallocation occurred: 63
bytes allocated, allocations, type, function, file:line
400 100 int[] test.append test.d:20
We can note that 100 allocations on line 20 are reported although only
one reallocation really happens.
When commenting line 6 (arr.reserve(50)) we get the following output:
$ dmd -profile=gc -run test.d ; cat profilegc.log
capacity: 0
reallocation occurred: 0
reallocation occurred: 3
reallocation occurred: 7
reallocation occurred: 15
reallocation occurred: 31
reallocation occurred: 63
bytes allocated, allocations, type, function, file:line
400 100 int[] test.append test.d:20
As many allocations exactly are reported by the GC profiler, and on
the same appending line. As far as I can tell arr.reserve does its
preallocation job but the GC is still reporting allocations that do
not appear.
--
More information about the Digitalmars-d-bugs
mailing list