http://d.puremagic.com/issues/show_bug.cgi?id=4447

           Summary: order of functions greatly affects execution time
           Product: D
           Version: D1 & D2
          Platform: Other
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nob...@puremagic.com
        ReportedBy: bra...@puremagic.com


--- Comment #0 from Brad Roberts <bra...@puremagic.com> 2010-07-11 09:03:17 PDT 
---
(split from bug 859)

=========== code ============
extern(C) int printf(const char*, ...);
extern(C) uint sleep(uint);

struct vector3 {
  float x;
  float y;
  float z;
}

class Timer {
  static long getTime() {
    asm {
      naked;
      rdtsc;
      ret;
    }
  }

  long starttime;
  string label;

  this() {
    starttime = getTime();
  }
  this(string label) {
    starttime = getTime();
    this.label = label;
  }
  ~this() {
    long endTime = getTime();
    if (label !is null) {
      printf("%*s ", label);
    }
    printf("time: %ld\n", endTime - starttime);
  }
}

float DOT(ref vector3 A, ref vector3 B) {
  return A.x * B.x + A.y * B.y + A.z * B.z;
}

void fooCompiler(ref vector3 a, ref vector3 b)
{
  scope Timer t = new Timer();

  float d = DOT(a, b);

  printf("compiler: d = %f, %p    ", d, &d);
}

void fooManual(ref vector3 a, ref vector3 b)
{
  scope Timer t = new Timer();

  float d = a.x * b.x + a.y * b.y + a.z * b.z;

  printf("manual:   d = %f, %p    ", d, &d);
}

void main() {
  vector3 a = { 1, 2, 3 };
  vector3 b = { 4, 5, 6 };

  version(warm)
  {{
    scope t = new Timer();
    float d = 1.0;
    printf("float rewarm: %f\n", d);
  }}

  version(one)
  {
    fooManual(a, b);
    fooCompiler(a, b);
  }
  version(two)
  {
    fooCompiler(a, b);
    fooManual(a, b);
  }
}
=====================

$ dmd -inline -O -release -version=one odd.d 
$ ./odd
manual:   d = 32.000000, 0xbf96e2e0    time: 218169
compiler: d = 32.000000, 0xbf96e2e0    time: 11543

$ dmd -inline -O -release -version=two odd.d 
$ ./odd
compiler: d = 32.000000, 0xbf8e98e0    time: 217847
manual:   d = 32.000000, 0xbf8e98e0    time: 11452

$ dmd -inline -O -release -version=one -version=warm odd.d 
$ ./odd
float rewarm: 1.000000
time: 227647
manual:   d = 32.000000, 0xbf9e86b0    time: 27762
compiler: d = 32.000000, 0xbf9e86b0    time: 8316

$ dmd -inline -O -release -version=two -version=warm odd.d 
$ ./odd 
float rewarm: 1.000000
time: 229782
compiler: d = 32.000000, 0xbf9ed650    time: 27664
manual:   d = 32.000000, 0xbf9ed650    time: 7987

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------

Reply via email to