Quels sont quelques conseils pour réduire l'utilisation de la mémoire des applications .NET? Considérez le programme C # simple suivant.
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
Compilé en mode version pour x64 et s'exécutant en dehors de Visual Studio, le gestionnaire de tâches signale ce qui suit:
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
C'est un peu mieux s'il est compilé uniquement pour x86 :
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
J'ai ensuite essayé le programme suivant, qui fait de même mais essaie de réduire la taille du processus après l'initialisation de l'exécution:
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);
}
Les résultats sur la version x86 en dehors de Visual Studio:
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
Ce qui est un peu mieux, mais cela semble tout de même excessif pour un programme aussi simple. Existe-t-il des astuces pour rendre un processus C # un peu plus léger? J'écris un programme conçu pour fonctionner en arrière-plan la plupart du temps. Je fais déjà des trucs d'interface utilisateur dans un domaine d'application séparé, ce qui signifie que les trucs d'interface utilisateur peuvent être déchargés en toute sécurité, mais occuper 10 Mo quand il est juste assis en arrière-plan semble excessif.
PS Quant à savoir pourquoi je m'en soucierais --- (Power) les utilisateurs ont tendance à s'inquiéter de ces choses. Même si cela n'a pratiquement aucun effet sur les performances, les utilisateurs semi-férus de technologie (mon public cible) ont tendance à s'embarrasser de l'utilisation de la mémoire des applications en arrière-plan. Même je panique quand je vois Adobe Updater prendre 11 Mo de mémoire et me sentir apaisé par la touche apaisante de Foobar2000, qui peut prendre moins de 6 Mo même en jouant. Je sais que dans les systèmes d'exploitation modernes, ce truc n'a vraiment pas beaucoup d'importance techniquement, mais cela ne veut pas dire que cela n'a pas d'incidence sur la perception.