Is there a list of things which are slow to compile?
aberba
karabutaworld at gmail.com
Fri Jun 5 08:25:13 UTC 2020
On Wednesday, 3 June 2020 at 17:02:35 UTC, H. S. Teoh wrote:
> On Wed, Jun 03, 2020 at 09:36:52AM +0000, drathier via
> Digitalmars-d-learn wrote:
>> I'm wondering if there's a place that lists things which are
>> slower/faster to compile? DMD is pretty famed for compiling
>> quickly, but I'm not seeing particularly high speed at all,
>> and I want to fix that.
>
> The two usual culprits are:
> - Recursive/chained templates
> - Excessive CTFE
>
> Note that while the current CTFE engine is slow, it's still
> reasonably fast for short computations. Just don't write nested
> loops or loops with a huge number of iterations inside your
> CTFE code, and you should be fine. And on that note, even
> running std.format with all of its complexity inside CTFE is
> reasonably fast, as long as you don't do it too often; so
> generally you won't see a problem here unless you have loop
> with too many iterations or too deeply-nested loops running in
> CTFE.
>
> Templates are generally reasonably OK, until you use too many
> recursive templates. Or if you chain too many of them together,
> like if you have excessively long UFCS chains with Phobos
> algorithms. Short chains are generally OK, but once they start
> getting long they will generate large symbols and large numbers
> of instantiations. Large symbols used to be a big problem, but
> ever since Rainer's fix they have generally been a lot tamer.
> But still, it's something to avoid unless you can't help it.
>
> Recursive templates are generally bad because they tend to
> produce a super-linear number of instantiations, which consume
> lots of compiler memory and also slow things down. Use too many
> of them, and things will quickly slow to a crawl.
>
> Worst is if you combine both deeply-nested templates and CTFE,
> like std.regex does. Similarly, std.format (which includes
> writefln & co) tends to add 1-2 seconds to compile time.
>
> Another is if you have an excessively long function body, IIRC
> there are some O(n^2) algorithms in the compiler w.r.t. the
> length of the function body. But I don't expect normal code to
> reach the point where this begins to matter; generally you
> won't run into this unless your code is *really* poorly written
> (like the entire application inside main()), or you're using
> excessive code generation (like the mixin of a huge
> procedurally generated string).
>
> Identifier lengths are generally no problem unless you're
> talking about 100KB-long identifiers, which used to be a
> problem until Rainer implemented backreferences in the
> mangling. But I don't expect normal code to generate symbols of
> this order of magnitude unless you're using excessively-long
> UFCS chains with nested templates. Identifier length generally
> doesn't even register on the radar unless they're ridiculously
> long, like tens or hundreds of KB long -- not something a human
> would type. What humans would consider a long identifier, like
> Java-style names that span 50 characters, are mere round-off
> error and probably don't even make a measurable difference. The
> problem really only begins to surface when you have 10,000
> characters in your identifier or larger.
>
> Comments are not even a blip on the radar: lexing is the
> fastest part of the compilation process. Similarly, aliases
> are extremely cheap, it's not even on the radar. Delegates have
> only a runtime cost; they are similarly unnoticeably cheap
> during compilation. As are Variants, unless you're running
> Variants inside CTFE (which I don't think even works).
>
>
> T
I'm thinking about a resource hub for D with information like
these. Can I use this information? ...of course I'll reference
this thread and you can always call for changes.
More information about the Digitalmars-d-learn
mailing list