Runtime reflection costs

Robert Fraser fraserofthenight at gmail.com
Sun Sep 28 11:06:29 PDT 2008


Christopher Wright wrote:
> Hey all,
> 
> A lot of my code uses a large amount of compile-time reflection. I was 
> working with my dependency injection library, coming up with speed 
> tests, and noticed that one sample (373 classes) took several minutes to 
> compile and resulted in a 4MB executable. The version with direct 
> constructor calls was 380KB -- dconstructor had an overhead of 8KB per 
> class! Templates can't be anywhere near as efficient as runtime 
> reflection in that case. There's pretty much no code reuse.
> 
> Now I'm thinking about runtime reflection. D doesn't support significant 
> runtime reflection -- you can invoke a default constructor, and that's it.
> 
> For my purposes, it would be convenient to have something of this nature:
> class ConstructorInfo
> {
>     void* functionPtr;
>     TypeInfo[] arguments;
>     Object invoke (void*[] args)
>     {
>         _d_invoke (arguments, args, functionPtr);
>     }
> }
> 
> The runtime would have to be able to take a void*[] and a TypeInfo[] and 
> unroll that into a method call. That should be reasonable, if D has a 
> consistent and not overly complicated ABI with decent documentation.
> 
> What's the overhead for this?
>  * It adds a function to the runtime -- one for each supported platform, 
> at least, or possibly one for each platform/compiler tuple.
>  * It adds a number of ConstructorInfo objects. In this case, they will 
> be sizeof(Object) + 3 * sizeof(size_t) (20 bytes on x86).
>  * You have to store pointers to the parameter types.
>  * It adds an array of ConstructorInfo in classinfo. This costs 2 * 
> sizeof(size_t) plus N * sizeof(size_t), where N is the number of 
> constructors.
> 
> Overall cost: 2D + (6 + R)N, where D is the number of classes, N is the 
> number of constructors, and R is the average number of parameters per 
> constructor; plus some inline assembly in the runtime, plus the cost of 
> documenting the ABI. The ABI documentation is required in other places, 
> and the runtime functions should not need updating once written.
> 
> For my 373-class sample, runtime reflection would add 16KB to the 
> executable. After optimization, templates cost 1.7MB.
> 
> Walter, would you accept patches to add runtime reflection to D? If so, 
> would you add them to D1?

FlectionedCall at one point could do this... it hasn't been updated in 
over a year, though. However, it shows that it is possible to do by 
scanning the symbols in the binary (i.e. no need for explicit runtime 
support).



More information about the Digitalmars-d mailing list