¿Cuáles son algunos consejos para reducir el uso de memoria de las aplicaciones .NET? Considere el siguiente programa sencillo de C#.¿Reduciendo el uso de memoria de las aplicaciones .NET?
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
Elaborado de liberación modo para x64 y se ejecuta 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 es compilado sólo para x 86:
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
Luego intenté th e siguiente programa, que hace lo mismo, pero trata de recortar el tamaño de proceso después de la inicialización en 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 x 86lanzamiento fuera de Visual Studio:
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
que es un poco mejor , pero aún parece excesivo para un programa tan simple. ¿Hay algún truco para hacer un proceso de C# un poco más delgado? Estoy escribiendo un programa que está diseñado para ejecutarse en segundo plano la mayor parte del tiempo. Ya estoy haciendo cosas de interfaz de usuario en un Application Domain por separado, lo que significa que las cosas de la interfaz de usuario se pueden descargar de forma segura, pero ocupar 10 MB cuando está sentado en segundo plano parece excesivo.
P.S. En cuanto a por qué me importaría --- (Poder) los usuarios tienden a preocuparse por estas cosas. Incluso si no tiene casi ningún efecto sobre el rendimiento, los usuarios expertos en semi-tecnología (mi público objetivo) tienden a tener ataques de histeria por el uso de la memoria de aplicaciones en segundo plano. Incluso me asusto cuando veo que Adobe Updater toma 11 MB de memoria y me alivia el tacto tranquilizador de Foobar2000, que puede tomar menos de 6 MB incluso cuando se reproduce. Sé que en los sistemas operativos modernos, estas cosas realmente no importan mucho desde el punto de vista técnico, pero eso no significa que no afecten la percepción.
¿Por qué te importa? El conjunto de trabajo privado es bastante bajo. Los SO modernos se enviarán al disco si la memoria no es necesaria. Es 2009. A menos que estés construyendo cosas en sistemas integrados, no deberías preocuparte por 10MB. –
Deja de usar .NET y puedes tener pequeños programas. Para cargar .NET Framework, es necesario cargar muchas DLL grandes en la memoria. –
Los precios de la memoria caen exponencialmente (sí, puede solicitar un sistema de computadora doméstico Dell con 24 GB de RAM ahora). A menos que su aplicación esté usando> 500MB la optimización no es necesaria. – Alex