Каковы некоторые советы по сокращению использования памяти приложениями .NET? Рассмотрим следующую простую программу С#.
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
Скомпилированный в режиме выпуска для x64 и работающий за пределами Visual Studio, диспетчер задач сообщает следующее:
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
Немного лучше, если он скомпилирован только для x86:
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
Затем я попробовал следующую программу, которая делает то же самое, но пытается обрезать размер процесса после инициализации во время выполнения:
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);
}
Результаты x86 Отпустите за пределами Visual Studio:
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
Это немного лучше, но для такой простой программы все еще кажется чрезмерным. Есть ли какие-либо трюки, чтобы сделать процесс С# немного более компактным? Я пишу программу, предназначенную для работы в фоновом режиме большую часть времени. Я уже делаю какие-либо материалы пользовательского интерфейса в отдельном Application Domain, что означает, что материал пользовательского интерфейса можно безопасно выгружать, но он занимает 10 Мб когда он просто сидит в фоновом режиме, кажется чрезмерным.
P.S. Что касается меня, я бы хотел, чтобы пользователи (Power) часто беспокоились об этих вещах. Даже если это практически не влияет на производительность, пользователи с полутехнологиями (моя целевая аудитория), как правило, вступают в свои подходы к использованию памяти фонового приложения. Даже я урод, когда вижу, что Adobe Updater принимает 11 Мб памяти и чувствует себя успокоенным успокаивающим прикосновением Foobar2000, которое может занять до 6 Мб даже при игре. Я знаю в современных операционных системах, этот материал действительно не имеет большого значения технически, но это не значит, что он не влияет на восприятие.