Quais são algumas dicas para reduzir o uso de memória de aplicativos .NET? Considere o seguinte programa C # simples.
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
Compilado no modo de lançamento para x64 e executando fora do Visual Studio, o gerenciador de tarefas relata o seguinte:
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
É um pouco melhor se for compilado apenas para x86 :
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
Em seguida, tentei o seguinte programa, que faz o mesmo, mas tenta diminuir o tamanho do processo após a inicialização do tempo de execução:
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);
}
Os resultados na versão x86 fora do Visual Studio:
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
O que é um pouco melhor, mas ainda parece excessivo para um programa tão simples. Existem truques para tornar um processo C # um pouco mais enxuto? Estou escrevendo um programa projetado para ser executado em segundo plano na maior parte do tempo. Já estou fazendo qualquer coisa de interface do usuário em um domínio de aplicativo separado que significa que as coisas da interface do usuário podem ser descarregadas com segurança, mas ocupar até 10 MB quando está apenas no fundo parece excessivo.
PS: Por que eu me importaria --- Usuários (avançados) tendem a se preocupar com essas coisas. Mesmo que quase não tenha efeito sobre o desempenho, usuários semitecnológicos (meu público-alvo) tendem a ter acessos de raiva sobre o uso de memória de aplicativos em segundo plano. Até eu enlouqueço quando vejo o Adobe Updater ocupando 11 MB de memória e me sinto aliviada com o toque calmante do Foobar2000, que pode ocupar menos de 6 MB mesmo durante a reprodução. Eu sei que em sistemas operacionais modernos, essas coisas realmente não importam muito tecnicamente, mas isso não significa que não afetem a percepção.