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