Computing Fibonacci numbers as a performance testsuite

From: Alex Vinokur (alexvn_at_bigfoot.com)
Date: 10/29/03


Date: Wed, 29 Oct 2003 14:07:53 +0200

An algorithm which computes very long Fibonacci numbers
  http://groups.google.com/groups?selm=bnni5p%2412i47o%241%40ID-79865.news.uni-berlin.de
  was used as a performance testsuite
  to compare speed of the code produced by various compilers.

===========================================================
Windows 2000 Professional Ver 5.0 Build 2195 Service Pack 2
Intel(R) Celeron(R) CPU 1.70 GHz
GNU time 1.7 (to get the real time used)
===========================================================

A. Real and processor time used to compute Fibonacci[10000] and Fibonacci[25000].

   Here are summary results.

|=========================================================
| | Opt | Fib-10000 | Fib-25000 |
| Compiler | Lev |-------------|-------------|
| | | Real : CPU | Real : CPU |
|========================================================|
| GNU gcc compiler |
|--------------------------------------------------------|
| g++ 3.3.1 (Cygwin) | No | 0.45 : 0.41 | 1.86 : 1.81 |
| | O1 | 0.28 : 0.24 | 1.03 : 0.99 |
| | O2 | 0.27 : 0.23 | 1.02 : 0.98 |
| | O3 | 0.27 : 0.24 | 1.02 : 0.98 |
| | | : | : |
| g++ 3.3.1 (Cygwin) | No | 0.33 : 0.30 | 1.59 : 1.56 |
| Mingw32 interface | O1 | 0.20 : 0.16 | 0.87 : 0.84 |
| | O2 | 0.19 : 0.16 | 0.85 : 0.82 |
| | O3 | 0.19 : 0.16 | 0.85 : 0.82 |
| | | : | : |
| gpp 3.2.1 (DJGPP) | No | 0.37 : 0.24 | 1.99 : 1.92 |
| | O1 | 0.20 : 0.11 | 1.15 : 1.05 |
| | O2 | 0.19 : 0.11 | 1.08 : 0.99 |
| | O3 | 0.19 : 0.11 | 1.08 : 0.99 |
| | | : | : |
|--------------------------------------------------------|
| Digital Mars C/C++ Compiler, STLport 4.5.3 |
|--------------------------------------------------------|
| Version 8.35n | - | 0.20 : 0.16 | 0.84 : 0.80 |
| | | : | : |
| Version 8.36.4n | - | 0.20 : 0.16 | 0.84 : 0.80 |
|=========================================================

B. The names of DLL files on which the programs depend :

   * g++ 3.3.1 (Cygwin)
     ------------------
     C:\cygwin\bin\cygwin1.dll
       C:\WINNT\System32\KERNEL32.dll
         C:\WINNT\System32\NTDLL.DLL

   * g++ 3.3.1 (Cygwin, Mingw32 interface)
     -------------------------------------
      C:\WINNT\System32\msvcrt.dll
        C:\WINNT\System32\KERNEL32.dll
          C:\WINNT\System32\NTDLL.DLL

   * gpp 3.2.1 (DJGPP)
     -----------------
     Unknown

   * Digital Mars C/C++ 8.35n
     ------------------------
     C:\WINNT\System32\KERNEL32.DLL
       C:\WINNT\System32\NTDLL.DLL
     C:\WINNT\System32\USER32.DLL
       C:\WINNT\System32\GDI32.DLL

C. Notes.
     Note-1. The main() program in
             http://groups.google.com/groups?selm=bnni5p%2412i47o%241%40ID-79865.news.uni-berlin.de
             was slightly changed to get the processor time used.

     // ------ Updated main() : BEGIN ------
     #include <time.h> // Added
     int main (int argc, char **argv)
     {
     const string option (check (argc, argv));
       if (option.empty())
       {
         usage (argv);
         return 1;
       }

     const uint N = atoi (argv[2]);

     const clock_t clock_start = clock(); // Added
       assert (clock_start != clock_t (-1)); // Added

       if (option == ALL_FIBS)
       {
         Fibonacci fib(N);
         fib.show_all_numbers();
       }

       if (option == TH_FIB)
       {
         Fibonacci fib(N);
         fib.show_last_number();
       }

       if (option == SOME_FIBS)
       {
         Fibonacci fib;
         for (int i = 2; i < argc; i++) fib.show_number (atoi(argv[i]));
       }

       if (option == RAND_FIBS)
       {
         const int max_rand_fib = (argc == 3) ? MAX_RAND_FIB : atoi (argv[3]);
         Fibonacci fib;
         for (uint i = 0; i < N; i++) fib.show_number (rand()%max_rand_fib);
       }

       // ------ Added : BEGIN ------
     const clock_t clock_end = clock();
       assert (clock_end != clock_t (-1));

       cerr << "CPU time used : " << (double (clock_end - clock_start)/CLOCKS_PER_SEC) << " sec" << endl;
       // ------ Added : END --------

       return 0;
     }
     // ------ Updated main() : END --------

  Note-2. To get the real time used the time() utility was used.

D. Comment.
     It seems that there is some inconsistency between real-time and CPU-time
     while computing Fibonacci [10000] through the DJGPP gpp compiler :
     CPU-time is too small with regard to real-time.
     Probably that might be caused by too small CLOCKS_PER_SEC value (91).
     Note. In Cygwin, MinGW, Digital Mars : CLOCKS_PER_SEC = 1000.

--
 =====================================
   Alex Vinokur
     mailto:alexvn@connect.to
     http://mathforum.org/library/view/10978.html
     news://news.gmane.org/gmane.comp.lang.c++.perfometer
   =====================================


Relevant Pages

  • Re: Got idle CPU cycles?
    ... Your CPU cycles could help ... We can easily script 8-hour overnight runs. ... Most people who would donate CPU time don't want you ssh-ing into ... their compilers to discover whether or not they have the neccessary ...
    (comp.os.linux.misc)
  • Re: SPEC CPU2006, how do you like it ?
    ... features of their compilers. ... system benchmark than a CPU compiler and memory benchmark. ... It is my belief that while SPEC benchmarks tend to drive change, ...
    (comp.arch)
  • Re: Java speed: Reality versus theory?
    ... >>>Could you name a single machine, where java is portable, and there aren't ... >>>any C compilers for it? ... >>if they did, I wouldn't be surprised if they ran Java, but did not have C ... > But this is implemented on a non-Java 8051 CPU with a JVM/OS in ROM. ...
    (comp.programming)
  • Re: AMD Sempron CPUTYPE & Co.
    ... Andrew P. wrote: ... >be compiled to be as fast as it can be on this CPU. ... Is there a way to tell compilers to use ... do a native port of ssh to native amd64 code and got a hugh speed ...
    (freebsd-questions)
  • Re: C-programmer needs Forth advice
    ... >>> Some say that modern compilers know the CPU better than you and can ... > Humans are also bad at mechanically & correctly applying a large ... >>> match the solution closer to the CPU. ... >>> real problem, but only its representation in C ...
    (comp.lang.forth)