bearophile Wrote:

> Strtr:
> > How much of an overhead is a call to a struct instance compared to a call 
> > to a object?
> 
> The situation is more complex than that. Structs don't have a pointer to the 
> virtual table and monitor, that saves memory and time. Less memory saves you 
> time if you have to allocate a large number of structs, for cache effects. 
> They can be allocated inside arrays (placement new allows you to do the same 
> with objects too), and generally LDC seems able to inline and manage them 
> more efficiently, it doesn't call a struct destructor.
> 
> If you for example write a ray tracer in D and you compile it with the quite 
> good LDC compiler, you can see a significant performance difference between 
> using a struct to represent a 3D vector (3 doubles, 24 bytes, always 
> stack-allocated) than using objects (even scoped objects, always allocated on 
> the stack). In D there are structs for a purpose.
> 
> D compilers aren't currently able to de-virtualize calls, so if you have a 
> tree made with two kinds of nodes (internal ones and leaves) and you need to 
> transverse it a very large number of times, you may end doing a large number 
> of virtual calls (you have two versions of the walking methods). In this 
> situation I've seen that using 3 tagged structs, one "virtual" little struct 
> that gets never instantiated, plus the two different nodes, the LDC compiler 
> is quite able to partially inline such recursive calls (it can be done with 
> an iterative stack too, but the final performance is about the same and the 
> code gets uglier), and the performance is visibly higher. Sometimes D structs 
> allow you to optimize in ways that Python doesn't allow you to :-) (Java 
> HotSpot is able to partially optimize this by itself, de-virtualizing and 
> then partially inlining the virtual recursive calls. But D language is 
> designed to not need such advanced compiler technology).

Thank you.
I will read wikipedia about the virtual method table.


Reply via email to