Was sind einige Tipps, um die Speichernutzung von .NET-Anwendungen zu reduzieren? Betrachten Sie das folgende einfache C # -Programm.
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
Der Task-Manager wurde im Release- Modus für x64 kompiliert und außerhalb von Visual Studio ausgeführt. Er meldet Folgendes:
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
Es ist ein bisschen besser, wenn es nur für x86 kompiliert wurde :
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
Ich habe dann das folgende Programm ausprobiert, das dasselbe tut, aber versucht, die Prozessgröße nach der Laufzeitinitialisierung zu reduzieren:
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);
}
Die Ergebnisse auf x86 Release außerhalb von Visual Studio:
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
Was ein bisschen besser ist, aber für ein so einfaches Programm immer noch übertrieben erscheint. Gibt es irgendwelche Tricks, um einen C # -Prozess etwas schlanker zu machen? Ich schreibe ein Programm, das die meiste Zeit im Hintergrund ausgeführt wird. Ich mache bereits Benutzeroberflächenmaterial in einer separaten Anwendungsdomäne, was bedeutet, dass das Benutzeroberflächenmaterial sicher entladen werden kann, aber 10 MB zu beanspruchen, wenn es nur im Hintergrund sitzt, scheint übermäßig.
PS Warum es mich interessieren würde --- (Power-) Benutzer neigen dazu, sich über diese Dinge Sorgen zu machen. Auch wenn es fast keine Auswirkungen auf die Leistung hat, neigen semi-technisch versierte Benutzer (meine Zielgruppe) dazu, über die Speichernutzung im Hintergrundanwendungen zu zischen. Sogar ich flippe aus, wenn ich sehe, dass Adobe Updater 11 MB Speicher benötigt, und fühle mich beruhigt von der beruhigenden Note von Foobar2000, die selbst beim Spielen weniger als 6 MB benötigen kann. Ich weiß, dass dieses Zeug in modernen Betriebssystemen technisch gesehen nicht so wichtig ist, aber das bedeutet nicht, dass es keinen Einfluss auf die Wahrnehmung hat.