Strange optimization/inlining error on gdc 0.19
Downs
default_357-line at mail.yahoo.de
Fri Jul 28 13:42:42 PDT 2006
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