Builtin array and AA efficiency questions
Random D user via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu Oct 15 09:47:35 PDT 2015
So I was doing some optimizations and I came up with couple basic
questions...
A)
What does assumeSafeAppend actually do?
A.1) Should I call it always if before setting length if I want
to have assumeSafeAppend semantics? (e.g. I don't know if it's
called just before the function I'm in)
A.2) Or does it mark the array/slice itself as a "safe append"
array? And I can call it once.
A.3) If A.2 is true, are there any conditions that it reverts to
original behavior? (e.g. if I take a new slice of that array)
I read the array/slice article, but is seems that I still can't
use them with confidece that it actually does what I want. I
tried also look into lifetime.d, but there's so many potential
entry/exit/branch paths that without case by case debugging (and
no debug symbols for phobos.lib) it's bit too much.
What I'm trying to do is a reused buffer which only grows in
capacity (and I want to overwrite all data). Preferably I'd
manage the current active size of the buffer as array.length.
For a buffer typical pattern is:
array.length = 100
...
array.length = 0
...
some appends
...
array.length = 50
...
etc.
There's just so much magic going behind d arrays that it's a bit
cumbersome to track manually what's actually happening. When it
allocates and when it doesn't.
So, I already started doing my own Buffer type which gives me
explicit control, but I wonder if there's a better way.
B.1) I have a temporary AA whose lifetime is limited to a known
span (might be a function or a loop with couple functions). Is
there way to tell the runtime to immeditially destroy and free
the AA?
I'd like to assist the gc with manually destroying some AAs that
I know I don't need anymore. I don't really want to get rid of
gc, I just don't want to just batch it into some big batch of gc
cycle work, since I know right then and there that I'm done with
it.
For arrays you can do:
int[] arr;
arr.length = 100;
delete arr; // I assume this frees it
but for AAs:
int[string] aa;
delete aa; // gives compiler error Error: cannot delete type
int[string]
I could do aa.destroy(), but that just leaves it to gc according
to docs.
Maybe I should start writing my own hashmap type as well?
B.2) Is there a simple way to reuse the memory/object of the AA?
I could just reuse a preallocated temp AA instead of
alloc/freeing it.
More information about the Digitalmars-d-learn
mailing list