Salut,
J'entend souvent deux sons de cloche, celui des gens d'internet qui disent un peu partout que std::vector (et les autres conteneurs modernes)
n'entrainent pas de perte de performances par rapport aux tableaux dynamiques. et ceux du/des collègues tendances barbus intégristes et adeptes du C with classes car les conteneurs STL sont beaucoup trop lents d'après eux.

J'ai donc fait un petit test que je partage avec vous. C'est assez intéressant, tant au niveau des perfs de std::vector que du coût du mode Debug contre le mode optimisé

J'ai un rempli un vecteur (values) de 15 000 000 de nombres aléatoire, et je vais en calculer l'intégrale de 3 facons différentes
Tableau dynamique C With classes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
clock_t before = clock();
long* integraltab =new long[NEntries];
memset(integraltab, 0, NEntries*sizeof(long)); 
integraltab[0]=values[0];
for (unsigned int i =1; i < NEntries; i++) { 
  integraltab[i]=integraltab[i-1]+values[i];
}
clock_t after = clock();

Index loop sur un vecteur CPP + STL
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
before = clock();
vector<long> integralvec2(NEntries);
integralvec2[0]=values[0];
for (unsigned int i =1; i < NEntries; i++) { 
  integralvec[i]=integralvec[i-1]+values[i];
}
after = clock();
En principe c'est le même code que le précédent, ce devrait donc être assez indépendant de mon niveau

Range based loop Cpp11
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
before  = clock();
vector<long> integralvec;
integralvec.reserve(NEntries);
long previousvalue = 0; 
for (const auto& val : values) { 
  integralvec.push_back(val+previousvalue);
  previousvalue = val;
} 
after = clock();
je ne suis pas un spécialiste des range based loop, j'ai donc pas forcément la meilleure méthode pour acceder à la valeur précédente.

J'ai la flemme de rajouter les itérateurs à mon tests

Les résultats

* En mode Debug (visual studio mode Debug, gcc -g -O0 )
* gcc 4.6.3 (virtualisé)
[TAB] Integral was computed in 210ms
We had : 15000000 entries
[VECTOR / index based loop] Integral was computed in 320ms
We had : 15000000 entries
[VECTOR / Range based loop] Integral was computed in 650ms
We had : 15000000 entries
* MS Visual studio 2012 (Natif)
[TAB] Integral was computed in 1013ms
We had : 15000000 entries
[VECTOR / index based loop] Integral was computed in 2911ms
We had : 15000000 entries
[VECTOR / Range based loop] Integral was computed in 14812ms
We had : 15000000 entries
On voit donc que les range based loop dégradent les perfs en débug, surtout avec visual studio. et que l'accès à un vecteur est sur les deux compilateurs environ 3 fois plus lent qu'à un tableau

* En mode Optimisé (visual studio mode Release, gcc -O3 )
* gcc 4.6.3 (virtualisé)
[TAB] Integral was computed in 140ms
We had : 15000000 entries
[VECTOR / index based loop] Integral was computed in 120ms
We had : 15000000 entries
[VECTOR / Range based loop] Integral was computed in 110ms
We had : 15000000 entries
* MS Visual studio 2012 (Natif)
[TAB] Integral was computed in 67ms
We had : 15000000 entries
[VECTOR / index based loop] Integral was computed in 76ms
We had : 15000000 entries
[VECTOR / Range based loop] Integral was computed in 83ms
We had : 15000000 entries

Bonne nouvelle, la compilation optimisée ramène les performances de std::vector à quelque chose de comparable avec un tableau dynamique (avec tout de même une perte d'environ 10% sous visual). (Sachant qu'il faudrait faire des moyennes sur 1000 essais pour avoir quelques chose de valide)
Il semblerait que gcc s'en sorte mieux avec C++11 (y aurait-il des optimisations cachées non faisable avec un tableau ?) que visual C++. Par contre en mode debug, on sent fortement le coup en perf d'un vecteur comparé à un tableau. On notera au passage que sur un tableau brut, gcc perd 50% de perf en debug, contre un facteur 8-9 avec visual (Par contre je m'aventurerai pas à dire si c'est l'un qui est mauvais en debug ou l'autre qui est mauvais en optimisation)


Je laisse les experts du forum commenter...