On Sunday, November 06, 2011 04:11:07 Jonathan M Davis wrote:
> On Sunday, November 06, 2011 13:39:27 Alex_Dovhal wrote:
> > "Marco Leise" <marco.le...@gmx.de> wrote:
> > > No way I heard of. You could delete the entries one by one. :D
> > > I guess setting all references to null is the easiest way to 'clear'
> > > an
> > > AA.
> > 
> > Thanks. I tried both of them in small benchmark. Results are
> > (1) fill_values(aa); aa = null
> > (2) fill_values(aa); aa.remove(...)
> > For both methods time1/time2 is around 35/52, with aa size 10, 100,
> > 1000,
> > and 10000.
> > Interesting enough, with aa size 1M, 10M, 100M time1/time2 is around
> > 1/1.
> > So (1) is prefered for 10-1000 elements situation i have, but it
> > allocates memory each time :( while 2 reuses it, IMHO.
> 
> 2 doesn't necessarily reuse it. It depends on what the GC does and how AAs
> are currently implemented. It's likely that in both cases, you end up with
> a fair bit of stuff which is on the heap and no longer referenced such that
> if a garbage collection cycle runs, it would be collected (or if one
> doesn't run, it just sits there still taking up memory). The only real
> difference is that _some_ of the memory will be reused with 2, whereas with
> 1, you need a whole new AA. In both cases, new memory will be required. How
> much that is depends n the current implementation of AAs. And which one is
> more likely to trigger a GC cycle probably depends on a number of factors.
> So, it wouldn't suprise me at all either way. I imagine that it's at least
> simpler for the GC to collect the memory quickly in the first case, since
> the entire AA can be collected instead of all of it, but I don't know.
> 
> AAs are a _completely_ different situation from dynamic arrays. With dynamic
> arrays, you have a clear block of contiguous memory that you're playing
> with, and it's obvious what's going to be reused if you want reuse. The
> situation is _far_ more complicated with a hash table, which is likely to
> have a fair number of items on the heap - particularly for handling each
> bucket (and there's a decent chance that each of those is a dynamic array).
> So, I very much doubt that your going to reuse much memory from an AA
> unless a GC cycle is run, regardless of whether you do #1 or #2.

And actually, I should point out that #2 would result in a _lot_ more overhead 
due to all the work done for each remove call than you get with #1. So, given 
that fact, I would actually _expect_ #1 to be faster in the general case.

- Jonathan M Davis

Reply via email to