En comparant le code de test avec Sam, j'ai déterminé que nous sommes tous les deux raison!
Cependant, à propos de différentes choses:
- Accès à la mémoire (lecture et écriture) est tout aussi rapide où que c'est - pile, global ou d'un segment.
-
L'allocation , cependant, est plus rapide sur la pile et le plus lent sur le tas.
Il va comme ceci: stack
< global
< heap
. (allocation de temps)
Je vous conseille d'être prudent avec cela, cependant.
Je recommande ce qui suit:
- Lorsque vous avez besoin pour créer de nombreux tableaux souvent, à l'aide de la pile peut être une énorme amélioration.
- Si vous pouvez recycler un tableau, faites-le dès que vous le pouvez! Le tas est le meilleur endroit pour une longue durée de stockage des objets.
(Remarque: 1. s'applique uniquement aux types de valeur; les types de référence sera alloué sur le tas et la prestation sera réduite à 0)
Pour répondre à la question elle-même: je n'ai pas rencontré de problème avec n'importe quel grand-essai à la cheminée.
Je crois que le seul problème possible(s) peut venir de la pagination de la mémoire.
Si la pile doit être continu, vous pouvez obtenir de l' OutOfMemoryException
s (ou StackOverflowException
s?) parce que quel que soit le bloc doit être alloué à côté peuvent être prises. Si la pile est paginée, il devrait y avoir aucun problème à votre demande.
Cependant, n'importe où vous attribuer votre tableau, il besoin continu de la mémoire, de sorte que, à moins que la pile d'un thread peut être déplacé, c'est le plus enclin à l'erreur de localisation de l'affecter.
La section ci-dessous est ma première réponse. Il est conservé pour référence seulement.
Mon test indique la pile de la mémoire allouée et de la mémoire globale est au moins 15% plus lent qu' (120%) de segment de mémoire allouée pour l'utilisation dans des tableaux!
C'est mon code de test, et c'est un exemple de sortie:
Stack-allocated array time: 00:00:00.2224429
Globally-allocated array time: 00:00:00.2206767
Heap-allocated array time: 00:00:00.1842670
------------------------------------------
Fastest: Heap.
| S | G | H |
--+---------+---------+---------+
S | - | 100.80 %| 120.72 %|
--+---------+---------+---------+
G | 99.21 %| - | 119.76 %|
--+---------+---------+---------+
H | 82.84 %| 83.50 %| - |
--+---------+---------+---------+
Rates are calculated by dividing the row's value to the column's.
J'ai testé sur Windows 8.1 Pro (avec mise à Jour 1), à l'aide d'un i7 4700 MQ, en vertu de l' .NET 4.5.1
J'ai testé les deux avec le x86 et le x64 et les résultats sont identiques.
Edit: j'ai augmenté la taille de la pile de tous les threads 201 MO, la taille de l'échantillon à 50 millions de dollars et une diminution des itérations à 5.
Les résultats sont les mêmes que ci-dessus:
Stack-allocated array time: 00:00:00.4504903
Globally-allocated array time: 00:00:00.4020328
Heap-allocated array time: 00:00:00.3439016
------------------------------------------
Fastest: Heap.
| S | G | H |
--+---------+---------+---------+
S | - | 112.05 %| 130.99 %|
--+---------+---------+---------+
G | 89.24 %| - | 116.90 %|
--+---------+---------+---------+
H | 76.34 %| 85.54 %| - |
--+---------+---------+---------+
Rates are calculated by dividing the row's value to the column's.
Cependant, il semble que la pile est en fait obtenir plus lent.