A significant performance difference

bearophile via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Sep 1 01:53:45 PDT 2014


ketmar:

Thank you for your analysis and code.

>         while (x.length) {
>           foreach (key; x.keys) {
>             auto pp = key in x;
>             if (pp is null) continue;
>             j = key;
>             p = *pp;
>             x.remove(j);

This is a little cleaner:

         while (x.length) {
             foreach (immutable j; x.keys) {
                 p = x[j];
                 x.remove(j);


> so yes, creating delegates are SLOW. even taking into account
> that we creating dynamic arrays with keys in this version, it's 
> rockin' fast.

This D version is much faster, it runs in about 0.26 seconds 
(while the C++ version runs in about 0.21 seconds), this is 
acceptable because x.keys allocates a dynamic array of keys in 
the middle of the code.

But I think the "j = x.byKey.front;  p = x.byValue.front;" code 
looks sufficiently idiomatic, and its performance is terrible. It 
seems fit for a performance bug report. I have to create a 
synthetic benchmark that shows just the problem.

Bye,
bearophile


More information about the Digitalmars-d-learn mailing list