Dopo la lunga ATE, Mauro ed io ci buttiamo in sessione sulle performance del GC tenuta da Claudio Caldato. Mauro ha documentato in modo superdettagliato la sessione quindi mi limito ad alcune cose che mi hanno catturato l'attenzione.
- Ngen. È importante ricordare che uno dei vantaggi è che permette la condivisione delle dll tra appdomain e processi. Tutto questo però solo se non viene fatto il rebasing della dll. Il rebasing è facile che accada visto che non ci sono settaggi in VS.NET per indicare l'indirizzo di caricamento della dll. Il rebasing abbatte il vantaggio in performance di Ngen e comporta l'impossibilità di condividere la dll con altri processi e appdomain, impattando quindi anche sulla memoria occupata.
- GC. controllare il survival rate perché se un oggetto finisce in gen2 pùo comportare una grossa perdita di performance. Controllare l'overall virtual memory. In Orcas GCSettings.LatencyMode è una proprietà che ci permette di controllare quanto sia invasivo il GC. I valori possibili sono Batch, Interactive, LowLatency. Quest'ultimo fa si che il GC ci interrompa per il minimo tempo possibile ed è indicato per esempio nel caso di acquisizione dati, gaming, etc. Un altra novità è un overload di GC.Collect che prende due parametri. Il primo è la generazione (0,1,2) e il secondo un enum con default, forced, optimized. Quest'ultimo permette di dare un consiglio al GC dicendogli di intervenire solo se ne ha bisogno. Tutto questo mi riporta al workshop in cui Francesco Carucci nella sessione di gaming ci aveva parlato dei problemi a controllare il GC. Questo dovrebbe poter risolvere... non posso dire altro che è favoloso.
- Reflection. È buona abitudine mettere da parte il MethodBase.MethodHandle per le successive invocazioni. Questo risparmia un bel po' di lavoro migliorando le performance.
Complimenti a Claudio per la sessione.