Strange optimization/inlining error on gdc 0.19

Downs default_357-line at
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