Quali sono alcuni suggerimenti per ridurre l'utilizzo della memoria delle applicazioni .NET? Considera il seguente semplice programma C #.
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
Compilato in modalità di rilascio per x64 e in esecuzione all'esterno di Visual Studio, il task manager riporta quanto segue:
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
È un po 'meglio se è compilato solo per x86 :
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
Ho quindi provato il seguente programma, che fa lo stesso ma cerca di ridurre le dimensioni del processo dopo l'inizializzazione del runtime:
class Program
{
static void Main(string[] args)
{
minimizeMemory();
Console.ReadLine();
}
private static void minimizeMemory()
{
GC.Collect(GC.MaxGeneration);
GC.WaitForPendingFinalizers();
SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,
(UIntPtr) 0xFFFFFFFF, (UIntPtr)0xFFFFFFFF);
}
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetProcessWorkingSetSize(IntPtr process,
UIntPtr minimumWorkingSetSize, UIntPtr maximumWorkingSetSize);
}
I risultati sulla versione x86 al di fuori di Visual Studio:
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
Che è un po 'meglio, ma sembra comunque eccessivo per un programma così semplice. Esistono trucchi per rendere un processo C # un po 'più snello? Sto scrivendo un programma progettato per funzionare in background la maggior parte del tempo. Sto già facendo qualsiasi cosa dell'interfaccia utente in un dominio dell'applicazione separato, il che significa che le cose dell'interfaccia utente possono essere scaricate in sicurezza, ma occupare 10 MB quando è seduto in background sembra eccessivo.
PS Quanto al motivo per cui mi interesserebbe --- Gli utenti (esperti) tendono a preoccuparsi di queste cose. Anche se non ha quasi alcun effetto sulle prestazioni, gli utenti semi-esperti di tecnologia (il mio pubblico di destinazione) tendono ad andare in crisi sull'utilizzo della memoria dell'applicazione in background. Anche io impazzisco quando vedo Adobe Updater prendere 11 MB di memoria e mi sento confortato dal tocco rilassante di Foobar2000, che può richiedere meno di 6 MB anche durante il gioco. So che nei sistemi operativi moderni questa roba non ha molta importanza tecnicamente, ma ciò non significa che non abbia un effetto sulla percezione.