Les templates et les performances.
Bonjour,
j'ai tenté de comparer les performances d'algorithmes basés sur l'utilisation de template.
J'ai voulu comparer le temps de calcul basés sur de prog différents qui font la même chose: on a un vecteur de paire<int,int> aléatoires. Le but est de compter le nombres de paires dont la première coordonnées est inférieur à 10. Ce vecteur contient 1000000 paires.
Le premier utilise les templates de la STL:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
for(int od=0;od<10;od++)
{
time_t start,end;
double dif;
int o=0;
time (&start);
for(int r=1;r<5;r++){
std::vector<pair<int,int>> VN;
fff(VN);// Cette fonction génère le vecteur aléatoire.
o=o+ count_if(VN.begin(), VN.end(),bind(tr1::cref(bind1st(less<int>(), 10)) ,(std::bind<int&>(std::get<0, int , int>, _1))));
}
}
time (&end);
dif = difftime (end,start);
fffd=fffd+dif;
} |
Le deuxième utilise une bonne vieille boucle if et for:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
for(int od=0;od<10;od++)
{
time_t start,end;
double dif;
int o=0;
time (&start);
for(int r=1;r<5;r++){
std::vector<pair<int,int>> VN;
fff(VN);// Cette fonction génère le vecteur aléatoire.
for(iterator k=VN.begin();k!=VN.end();k++){
if((*k).first<10) o=o+1;
}
}
time (&end);
dif = difftime (end,start);
fffd=fffd+dif;
} |
Hé bien malgré l'utilisation de ces templates, la boucle for-if reste supérieure en performances, puisque fffd dans le premier cas vaut 160, alors que dans le deuxième il faut 140.
Je pense que c'est l'utilisation des 3 bind qui fait que cela ralenti le calcul.
Je ne suis pas assez calé pour améliorer mon code, mais si vous avez des idées.