¿Cuáles son algunos consejos para reducir el uso de memoria de las aplicaciones .NET? Considere el siguiente programa simple de C #.
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
Compilado en modo de lanzamiento para x64 y ejecutándose fuera de Visual Studio, el administrador de tareas informa lo siguiente:
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
Es un poco mejor si está compilado solo para x86 :
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
Luego probé el siguiente programa, que hace lo mismo pero intenta recortar el tamaño del proceso después de la inicialización del tiempo de ejecución:
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);
}
Los resultados en la versión x86 fuera de Visual Studio:
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
Lo cual es un poco mejor, pero aún parece excesivo para un programa tan simple. ¿Hay algún truco para hacer que un proceso de C # sea un poco más sencillo? Estoy escribiendo un programa que está diseñado para ejecutarse en segundo plano la mayor parte del tiempo. Ya estoy haciendo las cosas de la interfaz de usuario en un dominio de aplicación separado, lo que significa que las cosas de la interfaz de usuario se pueden descargar de forma segura, pero ocupar 10 MB cuando está en segundo plano parece excesivo.
PD En cuanto a por qué me importaría --- los usuarios (avanzados) tienden a preocuparse por estas cosas. Incluso si casi no tiene ningún efecto en el rendimiento, los usuarios semi-conocedores de la tecnología (mi público objetivo) tienden a entrar en arrebatos sobre el uso de la memoria de la aplicación en segundo plano. Incluso me asusto cuando veo que Adobe Updater ocupa 11 MB de memoria y me tranquiliza el toque relajante de Foobar2000, que puede ocupar menos de 6 MB incluso cuando se reproduce. Sé que en los sistemas operativos modernos, estas cosas realmente no importan mucho técnicamente, pero eso no significa que no afecten la percepción.