Ao comparar o código de teste com Sam, concluí que ambos estamos certos!
No entanto, sobre coisas diferentes:
- O acesso à memória (leitura e gravação) é tão rápido onde quer que esteja - pilha, global ou pilha.
- Alocá- lo, no entanto, é mais rápido na pilha e mais lento na pilha.
É assim: stack
< global
< heap
. (tempo de alocação)
Tecnicamente, a alocação de pilha não é realmente uma alocação, o tempo de execução apenas garante que uma parte da pilha (quadro?) seja reservada para a matriz.
Eu recomendo fortemente ter cuidado com isso, no entanto.
Eu recomendo o seguinte:
- Quando você precisa criar matrizes com freqüência que nunca deixam a função (por exemplo, passando sua referência), o uso da pilha será uma enorme melhoria.
- Se você pode reciclar uma matriz, faça-o sempre que puder! A pilha é o melhor local para armazenamento de objetos a longo prazo. (poluir a memória global não é bom; os quadros de pilha podem desaparecer)
( Nota : 1. aplica-se apenas a tipos de valor; os tipos de referência serão alocados na pilha e o benefício será reduzido para 0)
Para responder à pergunta em si: Não encontrei nenhum problema em nenhum teste de pilha grande.
Acredito que os únicos problemas possíveis são um estouro de pilha, se você não tomar cuidado com suas chamadas de função e ficar sem memória ao criar seu (s) encadeamento (s) se o sistema estiver com pouca carga.
A seção abaixo é a minha resposta inicial. É errado e os testes não estão corretos. É mantido apenas para referência.
Meu teste indica que a memória alocada à pilha e a memória global são pelo menos 15% mais lentas do que (leva 120% do tempo) a memória alocada à pilha para uso em matrizes!
Este é o meu código de teste e é uma amostra de saída:
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.
Testei no Windows 8.1 Pro (com Atualização 1), usando um i7 4700 MQ, no .NET 4.5.1
. Testei com x86 e x64 e os resultados são idênticos.
Edit : aumentei o tamanho da pilha de todos os threads em 201 MB, o tamanho da amostra para 50 milhões e diminuímos as iterações para 5.
Os resultados são os mesmos que acima :
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.
No entanto, parece que a pilha está realmente ficando mais lenta .