Blast from the past here...

Enrico Migliore wrote:
> Hi,
> 
> I did some tests  in order to see which, among __fastcall, __stdcall,
> __cdecl, __inline,
> gives the fastest execution time:  my_functions() was called 300000000
> times
> 
> Processor = Intel Pentium 1.4 GHz
> OS = Windows 2000
> Compiler = Microsoft Visual C
> Executable type = release
> 
> ---------------------- code ------------------------------
> #include <stdio.h>
> #include <time.h>
> 
> /*
> *  qualifier: __fastcall, __stdcall, __cdecl, __inline
> */
> qualifier int my_function (int a, char *buf)
> {
> 
>    int  int_1 = 1987;
>    char char_1 = 'a';
>    long long_1 = 123456789L;
>    long long_2 = &long_1;
> 
>    if (a > 0)
>    {
>        a++;
>    }
>    else
>    {
>        a--;
>    }
>    if (int_1 > 9)
>    {
>        char_1++;
>    }
>    else
>    {
>        char_1--;
>    }
>    *long_2++;
>    if (buf == NULL)
>    {
>        return -1;
>    }
>    buf++;
>    return a;
> }
> 
> 
> double test (void)
> {
> 
>    long i;
>    int result;
>    char buf[8];
>    clock_t start;
>    clock_t stop;
>    double  duration;
> 
>    buf[0] = 0;
> 
>    start = clock();       for (i = 0; i < 300000000; i++)
>    {
>         result = my_function(10,buf);
>    }
>    stop = clock();
>    duration = (double) (stop - start) / CLOCKS_PER_SEC;
> 
>    return duration;
> }
> 
> 
> Results:
> 
> --------------------------------------------------------
> qualifier          |  test duration (maximize for speed = OFF)
> --------------------------------------------------------
> __fastcall       |     14.3900 seconds
> __stdcall        |     12.9700 seconds
> __cdecl (**)  |     13.6200 seconds
> __inline          |      12.9600 seconds
> 
> --------------------------------------------------------
> qualifier          |  test duration (maximize for speed = ON)
> --------------------------------------------------------
> __fastcall        |      5.9400 seconds
> __stdcall         |       6.5300 seconds
> __cdecl (**)   |       6.4800 seconds
> __inline           |       0.0000 seconds (*)
> 
> (*) suspicious

Actually, this is not suspicious - if the function is inlined, the
compiler can optimise the loop away. This is a common flaw with
benchmark code - not as smart as the compiler is :-)

> (**) __cdecl is the default qualifier
> 
> 
> 
> Conclusion:
> 
> __inline and __fastcall give the best results
> when the compiler is instructed to generate code
> with the flag "optimize for speed" enabled.
> 
> I also noticed that parameters marshalling is not an issue
> because the compiler will link the appropriate static library according
> to the optimization selected. Therefore, in win32, we should
> be able to optimize our C code for speed  without problems.
> 
> Enrico
> 
> 


-- 
http://www.apache-ssl.org/ben.html       http://www.thebunker.net/
**  ApacheCon - Dec 10-14th - San Diego - http://apachecon.com/ **
"There is no limit to what a man can do or how far he can go if he
doesn't mind who gets the credit." - Robert Woodruff

Reply via email to