GDC vs dmd speed
bearophile
bearophileHUGS at lycos.com
Mon Oct 14 14:06:23 PDT 2013
Spacen Jasset:
> const float pi = 3.14159265f;
>
> float dx = cast(float)(Clock.currSystemTick.length %
> (TickDuration.ticksPerSec * 10)) / (TickDuration.ticksPerSec *
> 10);
> float xRot = sin(dx * pi * 2) * 0.4f + pi / 2;
> float yRot = cos(dx * pi * 2) * 0.4f;
> float yCos = cos(yRot);
> float ySin = sin(yRot);
> float xCos = cos(xRot);
> float xSin = sin(xRot);
>
> float ox = 32.5f + dx * 64;
> float oy = 32.5f;
> float oz = 32.5f;
>
> for (int x = 0; x < width; ++x) {
> float ___xd = cast(float)(x - width / 2) / height;
> for (int y = 0; y < height; ++y) {
> float __yd = cast(float)(y - height / 2) / height;
> float __zd = 1;
The performance difference between the DMD and GDC compile is
kind of expected for FP-heavy code. Also try the new LDC2
compiler (ldmd2 for the same compilation switches) that sometimes
is better than GDC.
More comments:
- There is a PI in std.math (but it's not a float);
- Add immutable/const to every variable that doesn't need to
change. This is a good habit like washing your hands before
eating;
- "for (int x = 0; x < width; ++x)" ==> "foreach (immutable x; 0
.. width)";
- I suggest to avoid many leading/trailing newlines in identifier
names;
- It's probably worth replacing all those "float" with another
name, like "FP" and then define "alias FP = float;" at the
beginning. So you can see how much performance you lose/gain
using floats/doubles. In many cases in my code there is no
difference, but float are less precise. Floats can be useful when
you have many of them, in a struct or array. Floats can also be
useful when you call certain numerical functions that compute
their result by approximation, but on some CPUs sin/cos are not
among those functions.
Bye,
bearophile
More information about the Digitalmars-d
mailing list