Référence du fichier benchmark.cpp

#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <setjmp.h>
#include <iostream>
#include <wchar.h>
#include <vector>
#include <map>
#include <fstream>
#include <sstream>
#include <string>

Fonctions

bool doInteger (int parameter)
 Calculs sur les entiers.
bool doLong (int parameter)
 Calculs sur les entiers longs.
bool doDouble (int parameter)
 Calculs sur les doubles.
bool doIO (int parameter)
 Ecriture d'un fichier d'un pattern composé d'une ligne de lettres contenant des caractères accentués.
bool doMatrix (int parameter)
 Simple multiplication de deux matrices carrées.
bool doVector (int parameter)
 Création de deux vecteurs et divers opérations pour passer des éléments de l'un à l'autre.
bool doSort (int n)
 Tri d'un tableau d'ordre inversé par rapport à l'objectif.
bool doException (int parameter)
 Génére un nombre important d'exceptions dans une boucle.
bool doHash (int parameter)
 Ici on cré une table de hash<int,int> initialisé à FACTOR*parameter valeurs entières.
bool doTrigo (int parameter)
 Fonctions mathématiques et trigonométriques.
bool doConcatenation (int parameter)
 Concaténation de n chaines en une seule.
bool doLoop (int parameter)
 6 boucles imbriquées.
int main (int argc, char *argv[])
 Procédure principale de lancement d'un test.


Documentation des fonctions

bool doConcatenation ( int  parameter  ) 

Concaténation de n chaines en une seule.

Pour être plus juste par rapport à l'immutabilité des chaînes dans les langages Java et C#, ce sont les versions bufferisées qui sont utilisées.

Paramètres:
parameter nombre de concaténations.
Renvoie:
true si c'est ok
00361                                     {
00362   static const string PATTERN= "éàôabcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefgh";
00363   string result="";
00364   for (int i=0; i < parameter; i++) {
00365     result+=PATTERN;
00366   }
00367   
00368   return result.length() == parameter*PATTERN.length() && result.substr(result.length() - PATTERN.length()) == PATTERN;
00369 }

bool doDouble ( int  parameter  ) 

Calculs sur les doubles.

Paramètres:
parameter Nombre d'itérations
Renvoie:
True si le test est validé.
00073                              {
00074   double result = 1;
00075   for (int i = 1; i < parameter; i++) {
00076     result -= i;
00077     result += i;
00078     result *= i;
00079     result /= i;
00080   }
00081   return result == 1;
00082 }

bool doException ( int  parameter  ) 

Génére un nombre important d'exceptions dans une boucle.

Paramètres:
parameter nombre d'itérations.
Renvoie:
true si le test est validé.
00271                                 {
00272   int count=0;
00273   for (int i=0; i < parameter; i++) {
00274     try
00275     {
00276       if ((i % 2) == 0) {
00277         exception e;
00278         throw e;
00279       }
00280     }
00281     catch (exception &e)
00282     {
00283       count++;
00284     }
00285   }
00286   return count==parameter/2;
00287 }

bool doHash ( int  parameter  ) 

Ici on cré une table de hash<int,int> initialisé à FACTOR*parameter valeurs entières.

Ensuite on énumère ces valeurs pour les ajouter dans une seconde hash avec une clef % FACTOR.

Paramètres:
parameter La taille de la hash / FACTOR
Renvoie:
true si ok
00296                            {
00297   const int FACTOR = 100;
00298   const int ITEMS = FACTOR*parameter;
00299   map <int, int> hash1;
00300   map <int, int> hash2;
00301   int c = 0;
00302   
00303   for (int i=0; i<ITEMS; i++) {
00304     hash1.insert(map <int, int>::value_type(i, i) );
00305   }
00306   
00307   map <int, int> :: iterator h1_it;
00308   map <int, int> :: iterator h2_it;
00309   for (h1_it = hash1.begin() ; h1_it != hash1.end(); h1_it++) {
00310     int key=h1_it->first;
00311     int v1 = (int) h1_it->second;
00312     int key2=key % FACTOR;
00313     h2_it=hash2.find(key2);
00314     if (hash2.end()!=h2_it) {
00315       int v2 = (int) h2_it->second;
00316       v1 += v2;
00317     }
00318     hash2.insert(map <int, int>::value_type(key2, v1) );
00319   }
00320   return hash2.size()==FACTOR;
00321 }

bool doInteger ( int  parameter  ) 

Calculs sur les entiers.

Paramètres:
parameter Nombre d'itérations
Renvoie:
True si le test est validé.
00039                               {
00040   int result = 1;
00041   for (int i = 1; i < parameter; i++) {
00042     result -= i;
00043     result += i;
00044     result *= i;
00045     result /= i;
00046   }
00047   return result == 1;
00048 }

bool doIO ( int  parameter  ) 

Ecriture d'un fichier d'un pattern composé d'une ligne de lettres contenant des caractères accentués.

Ensuite relecture du même fichier ligne par ligne.

Paramètres:
parameter Nombre d'itérations
Renvoie:
True si le test est validé.
00091                          {
00092   const string PATTERN= "éàôabcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefgh";
00093   const string FILE_NAME="../tmp/test_cpp.txt";
00094   
00095   ofstream writer(FILE_NAME.c_str());
00096   for (int i=0; i<parameter; i++) {
00097     writer << PATTERN << endl;
00098   }
00099   writer.close();
00100   
00101   ifstream reader(FILE_NAME.c_str());
00102   string line;
00103   for (int i=0; i<parameter; i++) {
00104     reader >> line;
00105     if (line != PATTERN) {
00106       return false;
00107     }
00108   }
00109   reader.close();
00110   
00111   return true;
00112 }

bool doLong ( int  parameter  ) 

Calculs sur les entiers longs.

Paramètres:
parameter Nombre d'itérations
Renvoie:
True si le test est validé.
00056                            {
00057   long result = 1;
00058   for (int i = 1; i < parameter; i++) {
00059     result -= i;
00060     result += i;
00061     result *= i;
00062     result /= i;
00063   }
00064   return result == 1;
00065 }

bool doLoop ( int  parameter  ) 

6 boucles imbriquées.

Paramètres:
parameter nombre d'itérations à chaque étage
Renvoie:
True si le test est validé
00377                            {
00378   int a, b, c, d, e, f;
00379   double x = 0;
00380   for (a = 0; a <= parameter; a++) {
00381     for (b = 0; b <= parameter; b++) {
00382       for (c = 0; c <= parameter; c++) {
00383         for (d = 0; d <= parameter; d++) {
00384           for (e = 0; e <= parameter; e++) {
00385             for (f = 0; f <= parameter; f++) {
00386               x = a + b + c + d + e + f;
00387             }
00388           }
00389         }
00390       }
00391     }
00392   }
00393   return x == 6 * parameter;
00394 }

bool doMatrix ( int  parameter  ) 

Simple multiplication de deux matrices carrées.

L'utilisation des (new) permet d'être plus juste avec les autres langages.

Paramètres:
parameter taille de la matrice
Renvoie:
true si tout est ok
00121                              {
00122   // Create the the matrix
00123   int **m1= new int*[parameter];
00124   int **m2= new int*[parameter];
00125   int count = 1;
00126   for (int i = 0; i < parameter; i++) {
00127     m1[i] = new int[parameter];
00128     m2[i] = new int[parameter];
00129     for (int j = 0; j < parameter; j++) {
00130       m1[i][j] = count;
00131       m2[i][j] = 0;
00132       count++;
00133     }
00134   }
00135   
00136   
00137   // Create inversion matrix
00138   for (int i = 0; i < parameter; i++) {
00139     m2[i][parameter - i - 1] = 1;
00140   }
00141   
00142   
00143   // Multiply them
00144   int **mm= new int*[parameter];
00145   ;
00146   for (int i = 0; i < parameter; i++) {
00147     mm[i] = new int[parameter];
00148     for (int j = 0; j < parameter; j++) {
00149       int val = 0;
00150       for (int k = 0; k < parameter; k++) {
00151         val += m1[i][k] * m2[k][j];
00152       }
00153       mm[i][j] = val;
00154     }
00155   }
00156   
00157   
00158   // Check inversion
00159   for (int i = 0; i < parameter; i++) {
00160     for (int j = 0; j < parameter; j++) {
00161       if (mm[i][j] != m1[i][parameter - j - 1]) {
00162         return false;
00163       }
00164     }
00165   }
00166   
00167   // Free memory
00168   for (int i = 0; i < parameter; i++) {
00169       delete [] m1[i];
00170       delete [] m2[i];
00171       delete [] mm[i];
00172   }
00173   delete [] m1;
00174   delete [] m2;
00175   delete [] mm;
00176   
00177   return true;
00178 }

bool doSort ( int  n  ) 

Tri d'un tableau d'ordre inversé par rapport à l'objectif.

Paramètres:
n Taille du tableau
Renvoie:
true si le test est validé.
00221                    {
00222   int *ra = new int[n + 1];
00223   for (int i = 0; i <= n; i++) {
00224     ra[i] = n - i;
00225   }
00226   int i, j;
00227   int ir = n;
00228   int l = (n >> 1) + 1;
00229   int rra;
00230   
00231   for (;;) {
00232     if (l > 1) {
00233       rra = ra[--l];
00234     } else {
00235       rra = ra[ir];
00236       ra[ir] = ra[1];
00237       if (--ir == 1) {
00238         ra[1] = rra;
00239         break;
00240       }
00241     }
00242     i = l;
00243     j = l << 1;
00244     while (j <= ir) {
00245       if (j < ir && ra[j] < ra[j + 1]) {
00246         ++j;
00247       }
00248       if (rra < ra[j]) {
00249         ra[i] = ra[j];
00250         j += i = j;
00251       } else {
00252         j = ir + 1;
00253       }
00254     }
00255     ra[i] = rra;
00256   }
00257   for (i = 1; i < n; i++) {
00258     if (ra[i] > ra[i + 1]) {
00259       return false;
00260     }
00261   }
00262   return true;
00263 }

bool doTrigo ( int  parameter  ) 

Fonctions mathématiques et trigonométriques.

Paramètres:
parameter itéartions sur le test
Renvoie:
true si ok
00329                             {
00330   
00331   double sine = 0.0;
00332   double cosine = 0.0;
00333   double tangent = 0.0;
00334   double logarithm = 0.0;
00335   double squareRoot = 0.0;
00336   double cumul = 0;
00337   double full = 8 * atan(1);
00338   for (int i = 0; i < parameter; i++) {
00339     double angle = 0;
00340     while (angle < full) {
00341       sine = sin(angle);
00342       cosine = cos(angle);
00343       tangent = tan(angle);
00344       cumul += sine + cosine + tangent;
00345       angle++;
00346     }
00347     logarithm = log(i+1);
00348     squareRoot = sqrt(i+1);
00349     cumul += logarithm + squareRoot;
00350   }
00351   return cumul != 0;
00352 }

bool doVector ( int  parameter  ) 

Création de deux vecteurs et divers opérations pour passer des éléments de l'un à l'autre.

Paramètres:
parameter taille des vecteurs.
Renvoie:
true si le test est validé.
00187                              {
00188   vector<int> Li1;
00189   for (int i = 0; i < parameter; i++)
00190     Li1.push_back(i); //addlast
00191 
00192   vector<int> Li2=Li1;
00193   vector<int> Li3;
00194   
00195   while (!Li2.empty()) {
00196     Li3.push_back((int)*Li2.begin() ); //addlast
00197     Li2.erase(Li2.begin());
00198   }
00199   
00200   while (!Li3.empty()) {
00201     Li2.push_back( (int)*(Li3.end()-1) ); //addlast
00202     Li3.erase(Li3.end()-1);
00203   }
00204   
00205   vector<int> tmp;
00206   while (!Li1.empty()) {
00207     tmp.insert(tmp.begin() , (int)Li1[0]); //addfirst
00208     Li1.erase(Li1.begin());
00209   }
00210   Li1 = tmp;
00211 
00212   return (int)(Li1[0]) == parameter-1;
00213 }

int main ( int  argc,
char *  argv[] 
)

Procédure principale de lancement d'un test.

00399                                  {
00400   char * testName = argv[1];
00401   int parameter=atoi(argv[2]);
00402   bool result = false;
00403   clock_t startTime = clock();
00404   
00405   if (strcmp("Double", testName)==0) {
00406     result=doDouble(parameter);
00407   } else if (strcmp("Long", testName)==0) {
00408     result=doLong(parameter);
00409   } else if (strcmp("Integer", testName)==0) {
00410     result=doInteger(parameter);
00411   } else if (strcmp("Trigo", testName)==0) {
00412     result=doTrigo(parameter);
00413   } else if (strcmp("Loop", testName)==0) {
00414     result=doLoop(parameter);
00415   } else if (strcmp("IO", testName)==0) {
00416     result=doIO(parameter);
00417   } else if (strcmp("Exception", testName)==0) {
00418     result=doException(parameter);
00419   } else if (strcmp("Hash", testName)==0) {
00420     result=doHash(parameter);
00421   } else if (strcmp("Concatenation", testName)==0) {
00422     result=doConcatenation(parameter);
00423   } else if (strcmp("Matrix", testName)==0) {
00424     result=doMatrix(parameter);
00425   } else if (strcmp("Vector", testName)==0) {
00426     result=doVector(parameter);
00427   } else if (strcmp("Sort", testName)==0) {
00428     result=doSort(parameter);
00429   }
00430   clock_t stopTime = clock();
00431   if (!result) {
00432     wprintf(L"-1\n");
00433   } else {
00434     double elapsedTime = (stopTime - startTime) / (CLOCKS_PER_SEC / (double) 1000.0);
00435     long l = (long)elapsedTime;
00436     wprintf(L"%d\n",l);
00437   }
00438   return 0;
00439 }


Généré le Fri Jun 27 14:51:47 2008 par  doxygen 1.5.5