Iain Buclaw:

> 1) using pointers over dynamic arrays. (5% speedup)
> 2) removing the calls to CalVector4's constructor (5.7% speedup)

With DMD I have seen 180k -> 190k vertices/sec replacing this:

struct CalVector4 {
    float X, Y, Z, W;

    this(float x, float y, float z, float w = 0.0f) {
        X = x;
        Y = y;
        Z = z;
        W = w;
    }
}

With:

struct CalVector4 {
    float X, Y, Z, W=0.0f;
}

I'd like the D compiler to optimize better there.



> http://ideone.com/4PP2D

This line of code is not good:
auto vertices = cast(Vertex *) new Vertex[N];

This is much better, it's less bug-prone, simpler and shorter:
auto vertices = (new Vertex[N]).ptr;

But in practice in this program it is enough to allocate dynamic arrays 
normally, and then perform the call like this (with DMD it gives the same 
performance):
calculateVerticesAndNormals(boneTransforms.ptr, N, vertices.ptr, 
influences.ptr, output.ptr);

I don't know why passing pointers gives some more performance here, compared to 
passing dynamic arrays (but I have seen the same behaviour in other D programs 
of mine).

Bye,
bearophile

Reply via email to