Какие советы по сокращению использования памяти приложениями .NET? Рассмотрим следующую простую программу на C #.
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
Что немного лучше, но все же кажется чрезмерным для такой простой программы. Есть ли какие-нибудь уловки, чтобы сделать процесс C # немного проще? Я пишу программу, которая большую часть времени предназначена для работы в фоновом режиме. Я уже занимаюсь любым пользовательским интерфейсом в отдельном домене приложения, что означает, что пользовательский интерфейс можно безопасно выгружать, но занимать 10 МБ, когда он просто находится в фоновом режиме, кажется чрезмерным.
PS Насчет того, почему меня это волнует --- (Опытные) пользователи обычно беспокоятся об этих вещах. Даже если это почти не влияет на производительность, полутехнические пользователи (моя целевая аудитория) имеют тенденцию впадать в истерику по поводу использования памяти фоновыми приложениями. Даже я схожу с ума, когда вижу, что Adobe Updater занимает 11 МБ памяти, и чувствую себя успокаивающим от успокаивающего прикосновения Foobar2000, который может занимать менее 6 МБ даже во время игры. Я знаю, что в современных операционных системах эти вещи действительно не имеют большого значения технически, но это не значит, что они не влияют на восприятие.