AA Performance in Benchmarks

Chris via Digitalmars-d digitalmars-d at puremagic.com
Fri Apr 24 04:34:56 PDT 2015


On Friday, 24 April 2015 at 11:30:14 UTC, Chris wrote:
> On Friday, 24 April 2015 at 09:18:48 UTC, Chris wrote:
>> On Thursday, 23 April 2015 at 14:40:58 UTC, Shammah Chancellor 
>> wrote:
>>> So, I was tooling around with one of the benchmarks I saw 
>>> listed on twitter:
>>>
>>> https://github.com/kostya/benchmarks/tree/master/brainfuck
>>>
>>> This D benchmark spends most of it's time on AA lookups.   
>>> Discussions about the implementation aside, I am curious as 
>>> to why the D AA is so slow even after calling AA.rehash.
>>>
>>> I took a look at the Nim tables implementation, and it looks 
>>> that they use power-of-two vectors and use the property of 
>>> primitive roots modulo n to get the next value in the case of 
>>> a collision:
>>>
>>> ```
>>> proc nextTry(h, maxHash: THash): THash {.inline.} =
>>> result = ((5 * h) + 1) and maxHash
>>> ```
>>>
>>> So, my questions:
>>>
>>> 1) What are the general purpose performance implications of 
>>> something like this?
>>> 2) I saw a thread awhile ago where someone had posted an 
>>> updated implementation of the AA with benchmarks and showed 
>>> that it was substantially faster in all cases.  I can't find 
>>> the thread again -- what happened with this work?
>>>
>>> -Shammah
>>
>> Interesting. I noticed while doing some benchmarking that 
>> looking up data that is stored in an AA is slower than 
>> generating the data on the fly. I was really surprised.
>
> AA lookup is (more often than not) slightly slower than (or at 
> least as fast as) generating the data on demand:
>
> import std.datetime : benchmark, Duration;
> import std.string : format;
> import std.conv : to;
> import std.stdio : writeln;
>
> enum {
>   string[string] words = [
>     "Data1":"Blah",
>     "Data2":"Blub",
>   ],
>   string[] letters = ["B", "l", "a", "h"]
> }
>
> void main() {
>   words.rehash();
>   auto result = benchmark!(lookup, make)(100_000);
>   writeln(to!Duration(result[0]));
>   writeln(to!Duration(result[1]));
> }
>
> string lookup() {
>   auto blah = words["Data1"];
>   return blah;
> }
>
> string make() {
>   string res;
>   foreach (c; letters)
>     res ~= c;
>   return res;
> }
>
> dmd v2.067.0 -release -O -boundscheck=off -inline

Recte: I meant to say creating the data is slower here, of 
course. Ah, well, it's Friday!


More information about the Digitalmars-d mailing list