Reserving/Preallocating associative array?

Daniel Kozak kozzi11 at gmail.com
Mon Dec 30 06:06:43 PST 2013


On Saturday, 28 December 2013 at 20:20:36 UTC, Benjamin Thaut 
wrote:
> Because I was always curious to do some hashmap profiling with 
> real data, I did some more. Here are the results:
>
> My implementation. Power of two size (25% free):
> building hashmap: 8 seconds 28880605 ticks
> looking entries up: 0 seconds 31685 ticks
>
> My implementation. Prime number size (25% free):
> building hashmap: 8 seconds 26802252 ticks
> looking entries up: 0 seconds 27719 ticks
>
> My implementation. Prime number size (10% free):
> building hashmap: 8 seconds 29323952 ticks
> looking entries up: 0 seconds 32768 ticks
>
> My implementation. Prime number size (20% free):
> 26877474 entries
> building hashmap: 8 seconds 28895211 ticks
> sum 74128
> looking entries up: 0 seconds 33222 ticks
>
> My implementation. Prime number size (50% free):
> building hashmap: 8 seconds 27738475 ticks
> looking entries up: 0 seconds 25696 ticks
>
> OrderedAA (implementation of Daniel Kozak):
> building array: 13 seconds 45663219 ticks
> lookup: 0 seconds 236323 ticks
>
> Builtin AA:
> building array: 14 seconds 47175035 ticks
> lookup: 0 seconds 33692 ticks
>
>
> You can see, that both my implementation and daniel kozaks 
> outperform the builtin AA when filling the AA. Both my and 
> daniel kozaks version preallocate the internal array. Although 
> daniel kozaks version does one additional allocation per entry 
> to build the double linked lists.
> When not preallocating my implementation still outperforms the 
> builtin AA.
>
> When looking up data, my implementation outperforms both other 
> implementations. My implementation is only slightly faster then 
> the builtin one. Daniel Kozaks version is 8 times slower during 
> lookup compared to my implementation. I think this is mostly 
> due to cache misses caused by the linked list storage of the 
> entries.
> It is also interresting to note, that using prime number sizes 
> for the internal array of the AA improved the lookup 
> performance slightly in my implementation. A certain portion of 
> all entries in the internal array are always kept free. 
> Reducing this amount leads to worse performance during looup, 
> increasing it, gives better performance. You can gain a few 
> percent speed if you are willing to waste 50% memory. My 
> measurements show that 25% free entries seem to be the sweet 
> spot.

This is cool!

Can you post somewhere your code and data which you use for this 
test? I really like to test it on my new AA implementation :)


More information about the Digitalmars-d mailing list