D compiles fast, right? Right??

Jonathan Marler johnnymarler at gmail.com
Sun Apr 1 01:25:41 UTC 2018


On Saturday, 31 March 2018 at 21:37:13 UTC, Jonathan M Davis 
wrote:
> On Saturday, March 31, 2018 08:28:31 Jonathan Marler via 
> Digitalmars-d wrote:
>> On Friday, 30 March 2018 at 20:17:39 UTC, Andrei Alexandrescu
>>
>> wrote:
>> > On 3/30/18 12:12 PM, Atila Neves wrote:
>> >> Fast code fast, they said. It'll be fun, they said. Here's 
>> >> a D
>> >>
>> >> file:
>> >>      import std.path;
>> >>
>> >> Yep, that's all there is to it. Let's compile it on my 
>> >> laptop:
>> >>      /tmp % time dmd -c  foo.d
>> >>      dmd -c foo.d  0.12s user 0.02s system 98% cpu 0.139 
>> >> total
>> >
>> > Could be faster.
>> >
>> >> That... doesn't seem too fast to me. But wait, there's more:
>> >>      /tmp % time dmd -c -unittest foo.d
>> >>      dmd -c -unittest foo.d  0.46s user 0.06s system 99% cpu
>> >>
>> >> 0.525 total
>> >
>> > Not fast. We need to make -unittest only affect the built 
>> > module. Even though it breaks certain uses of 
>> > __traits(getUnittests). No two ways about it. Who can work 
>> > on that?
>> >
>> > Andrei
>>
>> If you approve of the -unittest=<pattern> approach then 
>> timotheecour has already offered to implement this.  It's 
>> pattern matching would work the same as -i and would also use 
>> the "implied standard exclusions" that -i uses, namely,
>>
>> -unittest=-std -unittest=-etc -unittest=-core
>>
>> This would mean that by default, just passing "-unittest" 
>> would exclude druntime/phobos just like "-i" by itself also 
>> does.
>
> And every time you used another library, you'd have the same 
> problem and have to add -unittest=- whatever for each and every 
> one of them, or you would have to use -unittest= with 
> everything from your application or library rather than using 
> -unittest. I really don't see how that scales well, and it's 
> way too manual and too easy to screw up. It might be a decent 
> idea for a workaround, but it's not a great solution.
>
> IMHO, this is really something that should be handled by the 
> compiler. It simply shouldn't be compiling in the unittest 
> blocks for modules that you're not compiling directly. And if 
> that's done right, then this whole problem goes away without 
> having to make sure that every project you work on is 
> configured correctly to avoid pulling in the unit tests from 
> everything that it depends on.
>
> And maybe figuring out what to do about __traits(getUnittests) 
> complicates things, but it seems like the fact that we're even 
> having this problem is due to a flaw in the design of D's unit 
> tests and that that should be fixed, not worked around.
>
> - Jonathan M Davis

Let's make this conversation a bit more concrete, I'm not sure we 
are discussing the exact same thing.

The proposed solution is to have -unittest mean "compile 
unittests for all 'compiled modules' according to the pattern 
rules".  The default pattern rule is to include all modules 
except druntime/phobos.

Say you have two "packages" foo and bar that contain modules 
inside their respective directories.  With the proposed 
-unittest=<pattern> this is the semantics you would get.

dmd -unittest       foo/*.d bar/*.d     # compiles unittests for 
foo/*.d and bar/*.d
dmd -unittest=foo   foo/*.d bar/*.d     # compiles unittests for 
foo/*.d
dmd -unittest=bar   foo/*.d bar/*.d     # compiles unittests for 
bar/*.d
dmd -unittest=foo.x foo/*.d bar/*.d     # compiles unittests for 
foo/x.d
dmd -unittest=-bar  foo/*.d bar/*.d     # compiles unittests for 
foo/*.d

Note that the default behavior makes sense, but this mechanism 
also allows you more fine-graned control to limit unittesting to 
certain packages or modules.  This degree of control would be 
quite helpful to me, any of the previously listed use cases 
represent valid scenarios that I would like to be able to do.  Do 
you have another solution that would provide this functionality?  
I don't see any reason not to support these use cases.



More information about the Digitalmars-d mailing list