I'm testing out some various compilation schemes with DMD. Right now I'm 
spawning multiple threads which simply do a `system` call with a string like 
"DMD -c somefile.d". I'd like to limit the number of active threads to 
something my CPU can handle (4 in this case since I've got 4 cores..).

How do I go about doing this?

Here's the function which I spawn:
void compileObjfile(string name)
{
    shell(r"dmd -od" ~ r".\cache\" ~ r" -c -version=Unicode 
-version=WindowsNTonly -version=Windows2000 -version=WindowsXP -I..\ " ~ name ~ 
" ");
}

So I just need to pass the module name to it. The trouble is, if I spawn this 
function inside a foreach loop, I'll inadvertently create a few dozen threads. 
This hogs the system for a while. :) (although this does seem to create some 
rather impressive compilation speeds, LOL!)

This is what the main function might look like:
void main()
{
    foreach (string name; dirEntries(curdir, SpanMode.shallow))
    {
        if (name.isfile && name.getExt == "d")
        {
            spawn(&compileObjfile, name);
        }
    }
}

Sidenotes: So I've tried compiling the win32 libraries via `DMD -lib`. DMD eats 
up over 300 Megs of memory, and its quite scary how fast that number grows. It 
took over 25 seconds to compile a lib file.

On the other hand, compiling .obj files one by one by blocking a single thread 
on system calls (in other words, single-threaded version), it takes about 15 
seconds to create a library file. In each instantiation DMD wastes only about a 
dozen or so Mbytes, maybe less.

When I spawn an unlimited number of threads via a foreach loop, again compiling 
object-by-object, the lib file is generated in only 5(!) seconds. I'm running a 
quad-core on XP32, btw.

So I'm a little perplexed, because according to Tomasz (maker of xfBuild) and 
his various posts, compiling .obj by .obj file should apparently be really 
really slow and -lib makes the fastest builds. But I'm getting the exact 
opposite results.

Reply via email to