2010-10-17 34 views
1

duplicatas possibles:
Using arrays or std::vectors in C++, what's the performance gap?
std::vector is so much slower than plain arrays?L'accès à un tableau est-il plus rapide que l'accès à un vecteur?

mémoire est le vecteur de 1000 éléments array [] est un tableau d'entiers de 1000 éléments

for (iteration = 0; iteration < numiterations; iteration++) { 
    for (j = 1; j < numints; j++) { 
     memory[j] += memory[j - 1]; 
     //array[j] += array[j - 1]; 
    } 
} 

Si je compare le temps de la boucle for après avoir exécuté 100 itérations , le temps requis pour accéder est très petit comparé à celui du vecteur

pourquoi est-ce le cas? parce que je pensais que les deux prend constante et presque en même temps ..

+3

Pouvez-nous nous en dire plus sur la plate-forme sur laquelle vous avez testé ce produit? Compilateur, optimisation/type de construction, ce genre de chose? Souvent, 'vecteur' est plus lent dans les versions de débogage, mais la même vitesse qu'un tableau brut dans les versions de construction ... – Doug

+0

Voir [ Utilisation de tableaux ou de std :: vectors en C++, quel est l'écart de performance? ] (http://stackoverflow.com/questions/381621/using-arrays-or-stdvectors-in-c-whats-the-performance-gap). La réponse acceptée montre l'assemblage généré avec essentiellement aucune différence entre un vecteur et un tableau, avec g ++ et -O3. –

+0

Iam utilisant la version 3.3.2 de gcc – ajayreddy

Répondre

0

Vrai, ils sont tous les deux temps constant. Cependant, un vecteur est un objet et il y a une pénalité pour rediriger les appels de fonction. Considérez ceci comme votre première expérience avec la surcharge de l'opérateur C++. La classe de vecteurs surcharge l'opérateur [] pour obtenir une sémantique similaire avec un tableau réel.

+3

C'est faux, je suis désolé. Une instance d'un 'std :: vector' est un objet uniquement dans le niveau du code source. Une fois compilé, il n'y a aucune trace du fait que c'est un objet. C'est aussi plat qu'un tableau simple.La seule différence qui subsiste est qu'un 'std :: vector' alloue dynamiquement de la mémoire, alors qu'un tableau primitif est compilé avec toutes ses données glorieuses. Ceci est nécessaire pour permettre le redimensionnement dynamique. C'est la seule pénalité que vous devriez voir, et vous ne payez qu'une seule fois au moment de la construction, pas au moment de l'accès. Si vous créez un tableau C qui peut croître, 'std :: vector' a exactement 0 (zéro, nada, nil). – wilhelmtell

+0

Hmm, c'est bon à savoir. Je retire ma déclaration précédente. +1 – SapphireSun

+0

Il est intéressant de noter que de petites performances * ont été obtenues en convertissant du code procédural de style C en code plus orienté objet. Je pense que la raison en est que le fait de placer des objets dans des objets indique au compilateur plus au sujet de l'absence d'alias possible - sorte de mettre 'restrict 'sur des pointeurs dans C99. À la fin, les objets «disparaissent» comme le dit Wilhelmtell, mais les informations supplémentaires aident encore l'optimiseur. – Doug

5

Comme la plupart (sinon toutes) implémentations de std::vector utiliser un tableau T* interne, il devrait y avoir aucune différence de performance du tout entre l'accès à un élément de vecteur et un élément C-tableau en utilisant l'opérateur [] lorsque les options d'optimisation sont définies. Essayez à nouveau votre test en utilisant les indicateurs d'optimisation de votre compilateur. Cependant, cela peut ne pas être le cas avec la fonction std::vector<T>::at, car cette fonction effectue une vérification des limites.

+0

Vous avez absolument raison, avec l'optimisation du niveau 3 iam obtenir les mêmes temps pour les deux mécanismes ..mais pouvez-vous s'il vous plaît m'expliquer les raisons ou me signaler les ressources contenant les raisons ..? – ajayreddy

+1

La construction optimisée hisse probablement le 'T *' dans un registre avant la boucle et utilise simplement ce pointeur directement à partir du registre. La même chose se produirait si vous passiez juste un vieux tableau (l'adresse serait dans le registre). Dans une construction non optimisée, la boucle interne est probablement en train de recharger ce 'T *'. –

+0

@ajayreddy, jetez un oeil à la réponse de Jerry Coffin. La raison de l'accélération est probablement liée au fait que la fonction 'operator []' est incorporée par l'optimiseur. –

4

Cela dépendra généralement (presque entièrement) si vous avez défini le compilateur sur les fonctions en ligne. std::vector utilise une fonction (nommée operator[]) pour adresser des éléments. Si cette fonction n'est pas générée en ligne, le temps d'appel de la fonction ajoutera une quantité importante au temps nécessaire pour traiter un élément dans le tableau. Si vous définissez le compilateur pour générer des fonctions en ligne, vous ne serez normalement pas en mesure de mesurer une différence significative entre les deux.