storing the hash multiplier instead of the hash value

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Mon Mar 22 15:00:57 PDT 2010


On 03/22/2010 04:59 PM, Andrei Alexandrescu wrote:
> On 03/22/2010 04:03 PM, Andrei Alexandrescu wrote:
>> On 03/22/2010 03:36 PM, Walter Bright wrote:
>>> Andrei Alexandrescu wrote:
>>>> Better suggestions are always welcome. For integrals I'm unclear on
>>>> what we could use to make things better. (Clearly we could and should
>>>> get rid of the extraneous field.)
>>>
>>> Unfortunately, it won't be much of a win. Memory allocation is done in
>>> buckets of size 16, 32, 64, etc. Reducing the node size for a uint[uint]
>>> from 16 to 12 saves no memory at all.
>>
>> As we discussed, if nodes are allocated in bunches, you could store 5
>> nodes in a 64-byte block instead of 4. That's more than a 25% increase
>> in effectiveness because the per-block bookkeeping is also slashed by 5.
>>
>> Andrei
>
> One more idea before I forget: the bunches approach requires using a
> freelist for nodes that are available but not used. (Freelists are a
> good idea whether or not bunches are used.)
>
> One good possibility is to store the head of the freelist in a static
> variable, such that e.g. all int[string] instances use the same
> freelist. And there's no thread contention issue because each thread has
> its own freelist.

And the last idea before I forget (just talked to Walter about it) is 
that the GC could and should offer functions:

GC.preCollect(void delegate());
GC.postCollect(void delegate());

That way we can effectively implement weak pointers.


Andrei



More information about the Digitalmars-d mailing list