Using Visual C++ 2008 (express), the following program will finish on my CPU in either 1 second or around 4 seconds according to whether the scanf("%i",&tt) line is quoted or not.
If it is enabled, I enter 0 (representing false), and one would then also expect the program to finish in 1 second, but unfortunately, it takes four.
I did a little research and it turns out that there's a type of loop optimization called "loop unswitching". This means that at compile time, the loop is essentially duplicated, and the if(tt) u=sin((double)n); is removed in one of the versions.
Unfortunately, Visual C++ isn't doing this optimization. Is there a way to force it to?
Code:#include <stdio.h> #include <stdlib.h> #include <sys/timeb.h> #include <math.h> void test(bool tt) { double d=0; double u=0; timeb ti; ftime( &ti ); double l = ti.time*1000.0 + ti.millitm; // Start the clock. for(int n=0; n<1000000000; n++) { d += u; // The sin math part will never execute, but the 'If' will be looked at every time // if the "scanf("%i",&tt)" line was used further below, and this will waste CPU cycles. // I want the compiler optimization called "loop unswitching" to // duplicate the entire For loop, with and without this line below. if(tt) u=sin((double)n); } ftime( &ti ); double l2 = ti.time*1000.0 + ti.millitm; // End the clock! printf("Time taken: %f\n",l2-l); printf("\n%f\n",d); } int main() { bool tt=0; scanf("%i",&tt); // User enters 0 if this line is unquoted. test(tt); system("PAUSE"); }



LinkBack URL
About LinkBacks




Chances are, if the compiler fails on an example as simple as this, it's more than likely to fail on a large project.