Allocare memoria sullo Heap porta ad un lavoro addizionale per il Garbage Collector e conseguentemente alla necessitΓ di hardware piΓΉ performante o a prestazioni inferiori. Eβ importante quindi conoscere come programmare riducendo, quando possibile, lβallocazione di variabili sullo heap. Ci sono diversi costrutti e tecniche che si possono utilizzare:
- Value types: Utilizzare strutture (struct) invece di classi quando Γ¨ possibile. Le strutture vengono allocate sullo Stack (o come parte di altre strutture) e non richiedono lβallocazione di memoria sullβheap.
- Stackalloc:
stackalloc
puΓ² essere utilizzato per allocare array e buffer temporanei sullo stack, evitando lβallocazione sullβheap. - Array Pooling: Puoi utilizzare il pooling di array per riutilizzare gli array invece di crearne di nuovi ogni volta che ne hai bisogno. La classe
ArrayPool<T>
fornisce un pool di array condiviso che puoi utilizzare per ridurre lβallocazione di memoria sullβheap. - Object Pooling: In modo simile allβArray Pooling, lβObject Pooling ti permette di riutilizzare gli oggetti invece di crearne di nuovi ogni volta che ne hai bisogno, riducendo cosΓ¬ la pressione sul garbage collector. Puoi utilizzare la classe
ObjectPool<T>
o implementare il tuo object pool personalizzato. - ** Utilizzare le classi Span e ReadOnlySpan e la Classe Memory per lavorare con segmenti di array senza dover allocare nuovi array. Queste classi forniscono una vista su un array esistente e possono essere utilizzate per ridurre lβallocazione di memoria sullβheap.
- Lazy Initialization: Utilizzare lβinizializzazione pigra per creare oggetti solo quando sono effettivamente necessari. Questo puΓ² aiutare a ridurre lβallocazione di memoria sullβheap e migliorare le prestazioni, specialmente se alcuni oggetti non vengono mai utilizzati durante lβesecuzione del programma.
- Ottimizzazione delle collection: Scegliere le collection appropriate per il tuo caso dβuso e preallocare la capacitΓ delle collezioni quando Γ¨ possibile. Ad esempio, se conosci la dimensione massima di una lista, puoi utilizzare il costruttore
List<T>(int capacity)
per preallocare la capacitΓ e ridurre le allocazioni di memoria sullβheap. - StringBuilder: Utilizzare la classe
StringBuilder
invece della concatenazione di stringhe per ridurre le allocazioni di memoria sullβheap quando si lavora con stringhe. - Evitare closure: Evitare di utilizzare closure (funzioni anonime che catturano variabili esterne) quando non sono necessarie, poichΓ© possono causare lβallocazione di memoria sullβheap.
- Delegates: Utilizzare metodi statici invece di metodi di istanza per i delegate quando Γ¨ possibile, in quanto i delegate che fanno riferimento ai metodi di istanza richiedono lβallocazione di memoria sullβheap.