La norme du vecteur et de stimuler tableau: qui est le plus rapide?
Comment la performance de boost::array
compare à celle de std::vector
, et les facteurs qui ont une influence sur elle?
- Je doute que cela peut être un goulot d'étranglement dans votre application.
- Je suis en train de faire le calcul scientifique et la vitesse est TRÈS important pour elle.
- Ensuite, vous devez savoir à profil.
- Ensuite, l'allocation de la mémoire et de la réaffectation sera votre seul véritable goulot d'étranglement. Si vous savez comment beaucoup d'éléments à stocker, commencer par l'un et l'utilisation par exemple
std::vector::reserve
. - Oui. Je pense la même manière. Mais est-il une différence majeure entre les réservant pour un vecteur et d'utiliser boost::array?
- Oui, parce que
boost::array
est dans la pile. Un vecteur est alloué dynamiquement. - l'un est de compiler limitée dans le temps, l'autre a la possibilité de grandir en cas de besoin - qui avez-vous besoin?
- Bien sûr.
- Un
boost::array
peut être soit statique ou dynamique affectées (c'est sur la pile ou dans le tas). La capacité de stockage pour unstd::vector
est toujours allouée dynamiquement, même si le vecteur est allouée statiquement.
Vous devez vous connecter pour publier un commentaire.
boost::array
(ou C++0x dustd::array
) devrait être plus rapide questd::vector
parce queboost::array
instances sont entièrement sur la pile. Cela signifieboost::array
n'a pas d'allocation de tas, et cela signifie aussi qu'il ne peut pas évoluer au-delà de la taille que vous spécifiez lors de la construction.Le but de
boost::array
est de servir comme une fine couche autour de primitif, de tableaux, de sorte que vous pouvez les traiter comme des conteneurs standard avec.begin()
,.end()
etc. Bon les compilateurs doivent éliminer tous les frais généraux deboost::array
tel qu'il s'effectue de manière identique à un primitif tableaux.Tout ce qui concerne "par défaut" de l'installation, où vous n'avez pas personnalisé allocateurs et que l'on mesure des choses simples comme la matrice de la construction, de l'accès et de modification des éléments. D'autre part, les choses peuvent tourner autour dans d'autres tests, d'autres plates-formes ou avec un astucieux programme d'installation. Par exemple,
std::vector
pourrait ne plus du tout être cher.std::vector
avec un autre est normalement une opération très rapide; la vitesse de la permutation de deux pointeurs. La permutation de deuxboost::array
cas pourrait être beaucoup plus cher; dans l'ordre de copien
éléments. Mais alors, dans C++0x, dontstd::array
sera une partie, la permutation de deux tableaux seront vite à nouveau, grâce aux références rvalue et leur sémantique de déplacement.boost::array
pourrait exiger une copie de chaque élément du tableau. Puis à nouveau, parfois la copie de n'importe quel objet est très rapide, même plus rapide que la copie d'un pointeur et même dans votre C++03 compilateur -- merci de copier élision.Vous pouvez profil pour voir qui est plus rapide pour votre utilisation, mais même ce test ne vous donner une idée pour une version particulière d'un compilateur sur une plate-forme particulière.
std::vector
ne peut pas être VACHE, indépendamment de la version de la norme que vous utilisez. C'est interdit par l'itérateur invalidation des règles.La meilleure façon de parvenir à une conclusion est d'écrire des programmes pour tester leurs performances avec l'énorme quantité de données. Sinon, comment on peut arriver à une conclusion?
Pendant que vous y êtes, vous pouvez avoir besoin de quelques outils pour vous aider, comme VTune, ou AMD CodeAnalyst Analyseur de Performances, etc. Très Somnolent (outil gratuit) est un C/C++ CPU profiler pour les systèmes Windows. Vous pouvez les essayer!
Plus vite à quoi?
std::vector
est plus rapide de taper parce qu'il a un moins de caractère.Il n'a pas d'importance ce qui est plus rapide, que vous comparez deux choses différentes, d'une manière statique tableau de taille avec dynamiquement un tableau de taille. Qui dépend de votre application, et n'a rien à voir avec la vitesse.
Voulez-vous exploiter un avion ou une voiture à un endroit? Il dépend de plus que ce qui est simplement "plus vite".
Un
boost::array
peut-être plus rapide à allouer parce que c'est, sur les machines, sur la pile. Oustd::vector
pourrait être presque aussi rapide parce que de coutume, l'allocation de la mémoire système.Mais c'est juste répartition. Ce sujet de l'utilisation? Et bien les deux sont juste des indices dans un tableau, donc peut-être pas la différence. Mais ce que sur le déplacement ou d'échange?
boost::array
certainement ne peut pas le faire aussi vite, parce questd::vector
n'a qu'à déplacer/échanger un pointeur. Ou peut-être pas, qui sait?Vous avez le profil et l'assemblée. Personne ne peut magiquement savoir comment les choses effectuer pour vous.
std::vector
pourrait facilement être submergé par le temps qu'il faut pour parcourir ce que vous avez alloué. Surtout si vous commencez à faire des passes à travers les données.array
etvector
servir des objectifs légèrement différents. Si vous initialisez unvector
à la taille dont vous avez besoin et il ne sera jamais ré-alloué, les performances entre les deux est identique.array
ne s'occupe que de manière statique de la taille des tableaux (C-style des tableaux si vous voulez).vector
peut se développer si vous poussez plus d'objets dans le conteneur qu'il a les capacités pour.std::array
(akaboost::array
) classe de modèle, qui a les mêmes performances de la redirection de "hit" comme un vecteur (les deux étant minute, il n'a pas d'importance de toute façon).