Al comparar el código de prueba con Sam, ¡determiné que ambos tenemos razón!
Sin embargo, sobre cosas diferentes:
- Acceder a la memoria (lectura y escritura) es igual de rápido donde sea que esté: pila, global o montón.
- Sin embargo, su asignación es más rápida en la pila y más lenta en el montón.
Dice así: stack
< global
< heap
. (tiempo de asignación)
Técnicamente, la asignación de la pila no es realmente una asignación, el tiempo de ejecución solo se asegura de que una parte de la pila (¿marco?) esté reservada para la matriz.
Sin embargo, recomiendo tener cuidado con esto.
Recomiendo lo siguiente:
- Cuando necesite crear matrices con frecuencia que nunca abandonen la función (por ejemplo, pasando su referencia), usar la pila será una mejora enorme.
- Si puede reciclar una matriz, ¡hágalo siempre que pueda! El montón es el mejor lugar para el almacenamiento de objetos a largo plazo. (contaminar la memoria global no es bueno; los marcos de pila pueden desaparecer)
( Nota : 1. solo se aplica a los tipos de valor; los tipos de referencia se asignarán en el montón y el beneficio se reducirá a 0)
Para responder a la pregunta en sí: no he encontrado ningún problema con ninguna prueba de gran tamaño.
Creo que los únicos problemas posibles son un desbordamiento de pila, si no tiene cuidado con sus llamadas a funciones y se queda sin memoria al crear su (s) hilo (s) si el sistema se está agotando.
La siguiente sección es mi respuesta inicial. Es incorrecto y las pruebas no son correctas. Se guarda solo como referencia.
¡Mi prueba indica que la memoria asignada a la pila y la memoria global son al menos un 15% más lentas que (toma el 120% del tiempo de) la memoria asignada en el montón para su uso en matrices!
Este es mi código de prueba , y esta es una salida de muestra:
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.
Probé en Windows 8.1 Pro (con la Actualización 1), usando un i7 4700 MQ, en .NET 4.5.1 Probé
con x86 y x64 y los resultados son idénticos.
Editar : Aumenté el tamaño de la pila de todos los hilos 201 MB, el tamaño de la muestra a 50 millones y disminuí las iteraciones a 5.
Los resultados son los mismos que los anteriores :
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.
Sin embargo, parece que la pila se está volviendo más lenta .