compile time tracing of d_do_test.d

Stefan Koch uplink.coder at googlemail.com
Sat Jun 6 18:04:26 UTC 2020


Hi Guys,

There's a tool running the dmd testsuite.
called d_do_test.d

It uses so much memory during compilation that the "-lowmem" 
switch is mandatory and it uses about as much time to compile as 
does dmd itself.

Interestingly in the case the reason is actually legitimately 
CTFE.

My profiling tool pointed to a function called unifyNewLines as 
the main time taker.
This was actually wrong.
But the real time taker was not far from it.

string unifyDirSep(string str, string sep)

For demonstration purposes, and because I am lazy, I did a quick 
hack to remove the CTFE from it

---
string unifyDirSep(string str, string sep)
{
     version(ctfe)
     {
     static Regex!char re  = 
regex(`(?<=[-\w{}][-\w{}]*)/(?=[-\w][-\w/]*\.(di?|mixin)\b)`, 
"g");
     return std.regex.replace(str, re, sep);
     }
     else
     {
     static Regex!char* re;
     if (re is null)
         (*re) = 
regex(`(?<=[-\w{}][-\w{}]*)/(?=[-\w][-\w/]*\.(di?|mixin)\b)`, 
"g");
     return std.regex.replace(str, (*re), sep);
     }
}
---

Take this function; put it into a file and compile that file.
If your configuration is anything like mine that'll take around 2 
seconds.
And it'll eat about 500 MB of ram
now compile that file with -version=ctfe
And you will see it taking 5 seconds and eating around 1.3GB of 
ram.

Cheers,

Stefan

P.S. Don't put your regex as initExp!




More information about the Digitalmars-d mailing list