I dun a DIP, possibly the best DIP ever

Stefan Koch uplink.coder at googlemail.com
Sat Apr 25 10:27:38 UTC 2020


On Saturday, 25 April 2020 at 10:11:08 UTC, Stefan Koch wrote:
> On Saturday, 25 April 2020 at 09:35:45 UTC, user1234 wrote:
>> On Saturday, 25 April 2020 at 09:33:19 UTC, Walter Bright 
>> wrote:
>>> On 4/24/2020 1:55 PM, Walter Bright wrote:
>>>> Another approach to resolving the original problem (template 
>>>> instantiation bloat) is for the compiler to recognize 
>>>> templates like AliasSeq as "special" and implement them 
>>>> directly.
>>>> 
>>>> For example, AliasSeq is defined as:
>>>> 
>>>>    template AliasSeq(TList...) { alias AliasSeq = TList; }
>>>> 
>>>> This pattern is so simple it can be recognized by the 
>>>> compiler. (Having std.meta.AliasSeq being a special name 
>>>> known to the compiler is not necessary.)
>>>
>>> Giving this a try:
>>>
>>> https://github.com/dlang/dmd/pull/11057
>>
>> Nice to see the idea applied. Can you give numbers, i.e from 
>> benchmarks ?
>
> this is for the following code:
>
> ---
> import std.meta;
> alias big_seq = AliasSeq!(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
> 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 
> 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 
> 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, /*goes 
> towards 4096*/); // this line was abbreviated.
> version(dotdotdot)
> {
>     enum x = (big_seq + 3)...;
> }
> else
> {
>     template Add3(alias y)
>     {
>         enum Add3 = y + 3;
>     }
>
>     enum x = staticMap!(Add3, big_seq);
> }
>
> pragma(msg, x.length + x[$-1]);
>
> dmd fresh from walters branch release build with ldmd(ldc) 1.20
> time:
> 0m0.230s
> time for a fresh dmd build under the same conditions with that 
> patch reverted:
> 0m0.270s
> time for doing it with our "..." patch:
> 0m0.030s
>
> these numbers are just a best out of 3 measurement so please 
> only see them as a rough guide.

I misspoke.
I had the tests in two different files at first and they were 
doing diffrent things.
When ... has to actually create the tuple our time is 0m0.210s

Let me post a version which is slightly more careful.

import std.meta;

import big_alias_seq;

// it's an aliasSeq containing the integers from 0 to 4095 
inclusive)

version(dotdotdot)
{
     mixin("enum x = (big_seq + 3)....length;");
}
else
{
      template Add3(alias y)
      {
         enum Add3 = y + 3;
      }

      enum x = staticMap!(Add3, big_seq).length;
}

pragma(msg, x);

Walters patch: 0m0.169s
Without Walters Patch: 0m0.177s
DotDotDot version: 0m0.024s

output for all 3 versions is:
4096LU


More information about the Digitalmars-d mailing list