Confrontando il codice di prova con Sam, ho determinato che entrambi abbiamo ragione!
Tuttavia, su cose diverse:
- L'accesso alla memoria (lettura e scrittura) è altrettanto veloce ovunque sia - stack, global o heap.
- Allocare , tuttavia, è più veloce nello stack e più lento nell'heap.
Va in questo modo: stack
< global
< heap
. (tempo di allocazione)
Tecnicamente, l'allocazione dello stack non è in realtà un'allocazione, il runtime si assicura solo che una parte dello stack (frame?) sia riservata all'array.
Consiglio vivamente di stare attento con questo, però.
Raccomando quanto segue:
- Quando è necessario creare frequentemente array che non escono mai dalla funzione (ad esempio passando il suo riferimento), l'utilizzo dello stack sarà un enorme miglioramento.
- Se riesci a riciclare un array, fallo ogni volta che puoi! L'heap è il posto migliore per l'archiviazione di oggetti a lungo termine. (inquinare la memoria globale non è bello; i frame dello stack possono scomparire)
( Nota : 1. si applica solo ai tipi di valore; i tipi di riferimento verranno allocati sull'heap e il vantaggio verrà ridotto a 0)
Per rispondere alla domanda stessa: non ho riscontrato alcun problema con nessun test di grandi dimensioni.
Credo che gli unici possibili problemi siano un overflow dello stack, se non stai attento con le tue chiamate di funzione e esaurisci la memoria quando crei i tuoi thread se il sistema sta per finire.
La sezione seguente è la mia risposta iniziale. È sbagliato e i test non sono corretti. È conservato solo come riferimento.
Il mio test indica che la memoria allocata in stack e la memoria globale è almeno del 15% più lenta della memoria allocata in heap (impiega il 120% del tempo) per l'utilizzo in array!
Questo è il mio codice di test e questo è un output di esempio:
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.
Ho provato su Windows 8.1 Pro (con aggiornamento 1), usando un i7 4700 MQ, sotto .NET 4.5.1
Ho provato sia con x86 che x64 e i risultati sono identici.
Modifica : ho aumentato la dimensione dello stack di tutti i thread 201 MB, la dimensione del campione a 50 milioni e ridotto le iterazioni a 5.
I risultati sono gli stessi sopra :
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.
Tuttavia, sembra che lo stack stia effettivamente diventando più lento .