Strange optimization/inlining error on gdc 0.19
Dave
Dave_member at pathlink.com
Fri Jul 28 13:20:02 PDT 2006
Just off-hand, try adding -frelease to the gdc switches. With the gdmd
script you can use the same opts. as dmd and it will do that.
Downs wrote:
> The following source code displays radically different times between
> Method 1 and Method 2. It seems some methods don't get inlined, since
> the dmd build results in far more similar timings.
> I would be grateful for an explanation.
>
> My values:
> DMD with -release -inline -O:
> Method 1: 93ms
> Method 2: 94ms
> GDC with -s -O3 -fomit-frame-pointer -funroll-loops -finline-functions:
> Method 1: 450ms <-- !!!!!!!!
> Method 2: 87ms
>
> The code for the benchmark was:
> import std.cstream;
> import std.perf;
>
> final class Small {
> float value;
> final void set(float inval) { value=inval; }
> final float get() { return value; }
> }
>
> final class Big {
> Small variable;
> public this() { variable=new Small(); }
> final Small getVar() { return variable; }
> }
>
> int main()
> {
> Big BigThing=new Big();
> Small SmallThing=new Small();
> void method1(inout Big A, inout Small B) { B.set(A.getVar().get()); }
> void method2(inout Big A, inout Small B) { B.value=A.variable.value; }
> uint benchmark(void delegate(inout Big, inout Small) fn, Big A,
> Small B, uint loops) {
> PerformanceCounter pc=new PerformanceCounter; pc.start();
> for (uint i=0; i<loops; ++i) fn(A, B);
> pc.stop(); return pc.microseconds();
> }
> const uint looplength=10000000;
> uint time1=benchmark(&method1, BigThing, SmallThing, looplength);
> uint time2=benchmark(&method2, BigThing, SmallThing, looplength);
> dout.writefln("time with method 1 = ", time1);
> dout.writefln("time with method 2 = ", time2);
> return 0;
> }
More information about the D.gnu
mailing list