Jakie są wskazówki, jak zmniejszyć zużycie pamięci przez aplikacje .NET? Rozważmy następujący prosty program w języku C #.
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
Skompilowany w trybie wydania dla x64 i działający poza programem Visual Studio, menedżer zadań raportuje następujące informacje:
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
Trochę lepiej, jeśli jest skompilowany tylko dla x86 :
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
Następnie wypróbowałem następujący program, który robi to samo, ale próbuje zmniejszyć rozmiar procesu po zainicjowaniu środowiska wykonawczego:
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);
}
Wyniki w wersji x86 poza programem Visual Studio:
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
Co jest trochę lepsze, ale nadal wydaje się przesadne w przypadku tak prostego programu. Czy są jakieś sztuczki, które sprawią, że proces C # będzie nieco odchudzony? Piszę program, który przez większość czasu działa w tle. Już robię wszelkie rzeczy związane z interfejsem użytkownika w oddzielnej domenie aplikacji, co oznacza, że elementy interfejsu użytkownika można bezpiecznie rozładować, ale zajmowanie 10 MB, gdy po prostu siedzi w tle, wydaje się nadmierne.
PS Co mnie to obchodzi --- Użytkownicy (Power) zwykle martwią się takimi rzeczami. Nawet jeśli nie ma to prawie żadnego wpływu na wydajność, średnio zaawansowani technicznie użytkownicy (moja grupa docelowa) mają tendencję do brzydkich ataków na temat wykorzystania pamięci aplikacji w tle. Nawet ja wariuję, gdy widzę, że Adobe Updater zajmuje 11 MB pamięci i czuję się uspokojony przez uspokajający dotyk Foobar2000, który może zająć poniżej 6 MB nawet podczas gry. Wiem, że w nowoczesnych systemach operacyjnych te rzeczy naprawdę nie mają większego znaczenia technicznie, ale to nie znaczy, że nie mają wpływu na percepcję.