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 : Sélectionner tout - Visualiser dans une fenêtre à part
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:
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
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.
Partager