[dmd-beta] ModuleInfo compaction

Walter Bright walter at digitalmars.com
Sun Jan 31 01:59:33 PST 2010


I agree my solution isn't too clever, and there's too much copy/paste; 
my first thought was to make it work and see how much it saves. It 
shaves 30,000 bytes off of phobos.lib, about 1%. Haven't tried it in an 
app to see.

Didn't think the performance matters much, except for the TLS 
ctors/dtors, which is why they are first. The rest are only done on 
startup, and will get lost in the noise. So I think your design is better.

Brad Roberts wrote:
> I like the idea of saving memory, I don't care for the implementation; all those
> if's which won't be branch predictable, I expect, and adds seem like they'll
> make looking up each element quite a bit more expensive.  Not to mention the
> amount of code repetition.  The repetition is easy to fix, but I don't have a
> good solution yet for the cost.
>
> The easy solution (quickly written and untested, and actually increases the
> runtime cost since it makes all the property functions cost as much as the worst
> case):
>
> void* calcPosition(uint mask)
> {
>     // NOTE: why does this use size_t explicitly rather than auto?
>     size_t off = New.sizeof;
>     auto flags = n.flags & mask;
>
>     if (flags & MItlsctor)      off += o.tlsctor.sizeof;
>     if (flags & MItlsdtor)      off += o.tlsdtor.sizeof;
>     if (flags & MIxgetMembers)  off += o.xgetMembers.sizeof;
>     if (flags & MIctor)         off += o.ctor.sizeof;
>     if (flags & MIdtor)         off += o.ctor.sizeof;
>     if (flags & MIictor)        off += o.ictor.sizeof;
>     if (flags & MIunitTest)     off += o.unitTest.sizeof;
>
>     if (flags & MIimportedModules)
>     {
>         auto plength = cast(size_t*)(cast(void*)(&this) + off);
>         off += size_t.sizeof + *plength * plength.sizeof;
>     }
>
>     if (flags & MIlocalClasses)
>     {
>         auto plength = cast(size_t*)(cast(void*)(&this) + off);
>         off += size_t.sizeof + *plength * plength.sizeof;
>     }
>
>     return cast(void*)(&this) + off;
> }
>
> Which you can call with:
>
> @property string name()
> {
>     if (isNew)
>     {
>         auto p - cast(immutable(char)*)(calcPosition(MASKname))
>         auto len = strlen(p);
>         return p[0 .. len];
>     }
>     else
>         return o.name
> }
>
> Obviously, you'll need to add the MAKS* enum to parallel the MI* enums.
>
> One way to solve the efficiency issue, at the cost of some memory would be to
> build a table of offsets.  Given the 7 fixed size elements, that's just 128
> combinations of fields.  Since the size of the largest offset is less than a
> byte, we can just use 7 bytes to hold the offset of each field.  That's not a
> large table.  Given that table, you could pick up the offset by something like:
>
> size_t off = table[((n.flags >> 3) & MImask)*7 + MIfieldnumtolookup]]
>
> I haven't thought it through well enough, but rearranging the 2 lengths for the
> last two fields to be before the variable length data might help a little since
> they could be included in the above table.
>
> Anyway, food for thought.
>
> Later,
> Brad
> _______________________________________________
> dmd-beta mailing list
> dmd-beta at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/dmd-beta
>
>
>   


More information about the dmd-beta mailing list