Quelles sont les astuces pour réduire l'utilisation de la mémoire des applications .NET ? Considérons le programme C# simple suivant.
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
Compilé dans libérer mode pour x64 et s'exécutant en dehors de Visual Studio, le gestionnaire de tâches rapporte ce qui suit :
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
C'est un peu mieux si c'est compilé juste pour x86 :
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
J'ai ensuite essayé le programme suivant, qui fait la même chose 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 x86 * Communiqué de presse * en dehors de Visual Studio :
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
C'est un peu mieux, mais cela semble encore 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 qui est conçu pour fonctionner en arrière-plan la plupart du temps. Je fais déjà tout ce qui concerne l'interface utilisateur dans un fichier séparé. Domaine d'application ce qui signifie que les éléments de l'interface utilisateur peuvent être déchargés en toute sécurité, mais occuper 10 Mo lorsqu'ils sont juste en arrière-plan semble excessif.
P.S. Quant à savoir pourquoi je m'en soucierais, les utilisateurs (puissants) ont tendance à s'inquiéter de ces choses. Même si cela n'a pratiquement aucun effet sur les performances, les utilisateurs semi-techniques (mon public cible) ont tendance à faire des crises de nerfs à propos de l'utilisation de la mémoire des applications en arrière-plan. Même moi, je panique quand je vois qu'Adobe Updater prend 11 Mo de mémoire et je me sens 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 genre de choses n'a pas vraiment d'importance sur le plan technique, mais cela ne veut pas dire qu'elles n'ont pas d'effet sur la perception.
14 votes
Pourquoi vous en soucier ? L'ensemble de travail privé est assez faible. Les systèmes d'exploitation modernes mettront en page sur le disque si la mémoire est inutile. On est en 2009. A moins que vous ne construisiez des choses sur des systèmes embarqués, vous ne devriez pas vous soucier de 10MB.
8 votes
Arrêtez d'utiliser .NET et vous pourrez avoir de petits programmes. Pour charger le cadre .NET, un grand nombre de grosses DLL doivent être chargées en mémoire.
2 votes
Les prix de la mémoire baissent de façon exponentielle (oui, vous pouvez commander un système informatique domestique Dell avec 24 Go de RAM maintenant). À moins que votre application n'utilise >500 Mo, l'optimisation est inutile.
0 votes
Supprimez toutes les références inutilisées dans votre application et votre code Imports (VB) ou Using (C#), afin que .NET charge la BCL la plus courte possible.
0 votes
Notez que les nouvelles éditions de .net incluent une collecte d'ordures plus agressive. Voir msdn.microsoft.com/fr/us/library/ee787088(v=vs.110).aspx
31 votes
@LeakyCode Je déteste vraiment que les programmeurs modernes pensent de cette façon, vous devriez vous soucier de l'utilisation de la mémoire de votre application. Je peux dire que la plupart des applications modernes, écrites principalement en java ou c# sont assez inefficaces quand il s'agit de la gestion des ressources, et grâce à cela en 2014 nous pouvons exécuter autant d'applications que nous pouvions revenir en 1998 sur win95 et 64mb de ram... juste 1 instance de navigateur mange maintenant 2gb de ram et IDE simple environ 1gb. La ram est bon marché, mais cela ne signifie pas que vous devez la gaspiller.
7 votes
@Petr Vous devriez vous soucier de la gestion des ressources. Le temps du programmeur est aussi une ressource. S'il vous plaît ne pas trop généraliser le gaspillage de 10MB à 2GB.