Quand la fragmentation adresse gérée en tas
-
25-09-2019 - |
Question
Je lisais un par Josh Smith, où il a utilisé un mécanisme de cache afin de « réduire la fragmentation du tas géré ». Sa mise en cache réduit le nombre d'objets de courte durée en cours de création au détriment de la vitesse d'exécution un peu plus lent.
Combien d'un problème est géré la fragmentation du tas dans un langage managé comme C #? Comment peut-on diagnostiquer si elle est un problème? Dans quelles situations auriez-vous besoin généralement pour y remédier?
La solution
Pas trop rapidement. Il est généralement très pas cher pour avoir des objets de courte durée. Pour un cache soit rentable, il faudrait être (très) nombreux candiadates et ils devraient vivre assez longtemps pour se rendre à la prochaine génération.
Comment peut-on diagnostiquer si elle est un problème?
Avec un profileur. Je ne suis pas si sûr l'auteur de l'article a fait.
Combien d'un problème est géré la fragmentation du tas dans un langage managé comme C #?
Pour autant que je sais qu'il est rare. .NET a un compactage éboueur qui empêche la plupart des formes de fragmentation. Il y a des problèmes avec le grand objet Heap parfois.
Edit:
Quand vous passez par les commentaires ci-dessous l'article que vous trouverez que quelqu'un mesuré et trouvé le cache d'être beaucoup plus lent que la création de nouveaux EventArgs chaque fois.
Conclusion: Mesure avant de commencer à optimiser. Ce ne fut pas une bonne idée / exemple.
Autres conseils
Sauf si vous avez affaire à 10K + petits objets de courte durée par seconde, il ne devrait pas être un problème du tout sur un ordinateur moderne avec une quantité raisonnable de RAM.
Alors d'abord, vous devez exécuter le code dans tous les scénarios raisonnables et si elle est assez vite -. Ne vous inquiétez pas à ce sujet
Si vous n'êtes pas satisfait de la vitesse, vous voyez que le code parfois « selfs » ou simplement curieux, vous pouvez suivre diverses statistiques de mémoire .NET ( http://msdn.microsoft.com/en-us/library/x2tyfybc.aspx ) dans l'application Analyseur de performances (vient dans le cadre de Windows ). Plus précisément, vous êtes intéressé par% Temps en GC.
Redgate ANTS profileur surveille également ces statistiques.
géré la fragmentation du tas est généralement en raison d'épingler des objets. Les objets s'épinglés lorsque le code managé passe le pointeur d'objet au code natif et l'objet ne peuvent pas être déplacés parce que la référence est transmise au code natif. Ceci est très fréquent quand il y a beaucoup d'activités d'E / S. Comme mentionné ci-dessus, il arrive souvent que dans LOH.