Two ideas for faster builds
Jonathan M Davis via Digitalmars-d
digitalmars-d at puremagic.com
Thu Jun 11 16:19:05 PDT 2015
On Thursday, 11 June 2015 at 21:41:27 UTC, Laeeth Isharc wrote:
> On Thursday, 11 June 2015 at 21:02:36 UTC, Jonathan M Davis
> wrote:
>> The other fun one is the insane number of template
>> instantations we get for stuff like std.algorithm thanks to
>> all of those helper templates like isInputRange. IIRC,
>> std.algorithm's unit tests instantiate over a million
>> different template instances - and much of that is simply for
>> template constraints and static ifs. So, improving build times
>> with regards to templates which are instantiated would
>> probably be the second largest gain to be had behind CTFE if
>> we could improve it, but obviously, we'd have to make such
>> improvements to be sure.
>
> I am following along and learning, but could you perhaps
> elaborate
> on this a bit more if you have time. I can see that the unit
> test
> template proliferation makes running unit tests slow for
> std.algorithm. But why does it affect builds in other respects
> if you are just importing std.algorithm from a non-phobos code
> base? Or was this an example of the extreme case as an
> illustration?
It's what happens when you use traits like isInputRange,
isForwardRange, etc. all over the place. std.algorithm is likely
an extreme case, because it's _all_ templated, and it has lots of
different static if branches and function overloads for
efficiency, and of course, we're talking about the unit tests in
particular, so they have to be instantiating all of the various
functions in std.algorithm with all kinds of different arguments.
You quickly get a combinatorial explosion of template
instantiations where a large portion of those templates are
eponymous templates used specifically for template constraints
and static ifs.
I'd have to track down the posts that Don made on the matter to
give any concrete details, but it's was quite surprising to many
of us when we found out just how many times many of these basic
trait templates were being instantiated.
User code will run into similar problems if it makes heavy use of
such templates in template constraints and static if branches and
then actually tests all the various combinations in its unit
tests, but your average program likely doesn't instantiate stuff
like isInputRange anywhere near as much as std.algorithm's unit
tests do. It will mostly be unit test builds which have this
problem. Still, anything that we can do to improve the compiler's
performance in the face of these common idioms will definitely
help compilation time.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list