Il est largement connu du bon sens, que pour la plupart des algorithmes, l'affectation et la translocation de données sur la pile est beaucoup plus rapide que de le faire sur le tas. En C ++, la différence dans le code est comme vs. P> mais il y a des différences significatives, quand il s'agit d'accéder à et calculer avec des données qui mentent sur le tas ou sur la pile? C'est à dire. Existe-t-il une différence de vitesse pour p> Le code est nécessaire pour exécuter sur plusieurs architectures différentes, essayer et mesurer ne fonctionnera donc pas. p> p>
4 Réponses :
Entrée d'allocation, il ne devrait y avoir aucune différence discernable entre accéder aux données, qu'il s'agisse d'une empilement ou d'un tas - c'est toute la mémoire à la fin de la journée. P>
La pile sera dans le cache Mais la réponse la plus précise est probablement: elle dépend ... p>
Il pourrait y avoir (hautement système dépendant) des problèmes de la localité de cache et de la lecture / écriture des misses. Si vous exécutez votre programme sur les données de la pile et em>, il est concevable (en fonction de votre architecture de cache) que vous pourrez rencontrer plus de cachettes, que si vous l'exécutez entièrement sur une région de Continuos de la pile. Voici le document à ce numéro par Andrew Appel (de SML / NJ) et Zhong Shao où ils enquêtent exactement de cette chose, car une allocation de pile / de tas est un sujet pour la mise en œuvre de langues fonctionnelles: P>
http://citeeerx.ist.psu.edu /viewdoc/summary?diodi=10.1.48.3778 P>
Ils ont trouvé des problèmes de performance avec écriture maladies mais estimées celles-ci seraient résolues par des progrès de la mise en cache. P>
Donc, mon devinez pour un ordinateur de bureau contemporain / serveur est que, à moins que vous n'exécutant plus fortement optimisé, code spécifique de l'architecture qui diffuse des données le long des lignes de cache, vous ne remarquerez aucune différence entre les accès de la pile et du tas. Les choses peuvent être différentes pour les appareils avec de petites caches (comme un contrôleur de bras / MIPS), où ignorer le cache peut avoir des effets de performance notable de toute façon. P>
La pile est probablement dans le cache déjà, un bloc de tas fraîchement attribué n'est probablement pas. Toutefois, il s'agit d'une première pénalité d'exécution uniquement. Pour des quantités importantes de données, vous battez le cache de toute façon p> li>
L'allocation de pile elle-même est un peu moins chère que l'allocation de tas, car l'allocation est plus simple p> li>
long terme, le principal problème d'un tas est généralement une fragmentation, un "coût accumulé" qui (généralement) ne peut être attribué à une seule allocations, mais peut augmenter considérablement le coût des autres allocations P> li>
ul>
Mesurer ces effets est délicat au moins. p>
Peu de choses peuvent être dites sans plus de contexte. Il y a quelques effets en faveur de la pile qui sont négligeables pratiquement tout le temps. p>
Au cas où il aide, Voici une référence simple qui vient de lire et écrit à chaque élément d'un grand tableau. Sur ma machine, il fonctionne au moins 5 fois plus rapidement lorsque le tableau est sur la pile.