On 6/11/2013 12:35 AM, Don Clugston wrote:


It's not a compiler bug. It's something more interesting.
I counted the number of instantiations in std.algorithm -unittest.
635 templates are instantiated, half of them only 1 to 10 times.
These ones here cover 70% of the total.

70763    isNarrowString
31279    binaryFun
24425    isInputRange
22308    Unqual
15563    startsWith
15381    isBidirectionalRange
11405    endsWith
7861    FormatSpec
7277    OriginalType
7275    to
6723    TypeTuple
5827    defaultInit
5713    from
5413    isRawStaticArray

Then, the question is, how do we get 71K different types to instantiate isNarrowString with? There aren't nearly that many types declared in the program!
Turns our it's things like:

Zip!(Sequence!("n", Tuple!(ulong)), Sequence!("n", Tuple!(int)), Result, Repeat!(Sequence!("n", Tuple!(int))), Repeat!(Result))

So we've got a combinatorial explosion of types happening here. I'm sure that's true for the other massively-instantiated templates as well. If we could avoid this, we would get an order of magnitude improvement in memory usage and compilation time.



This is great information. 71000 instantiations of isNarrowString!! Definitely need a hash rather than a linear list. I had no idea. You're right, though, about figuring out a way to avoid this. isNarrowString is nothing more than:

template isNarrowString(T)
{
enum isNarrowString = (is(T : const char[]) || is(T : const wchar[])) && !isAggregateType!T;
}

Makes me wonder why isAggregateType is not 71000 instantiations, too?

Maybe we can avoid generating a mangled name for a template if it is an eponymous one that evaluates to a manifest constant? This will save a ton of memory.

_______________________________________________
dmd-internals mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/dmd-internals

Reply via email to