Une collecte des ordures n'est pas seulement se débarrasser de non référencées objets, elle aussi compacte du segment. C'est un élément très important de l'optimisation. Il n'est pas seulement que l'utilisation de la mémoire plus efficace (pas de trous inutilisés), il rend le cache du PROCESSEUR beaucoup plus efficace. Le cache est vraiment une grosse affaire sur les processeurs modernes, ils sont un simple ordre de grandeur plus rapide que le bus mémoire.
Le compactage est réalisé par un simple copier-octets. Cela, cependant, prend du temps. La plus grande de l'objet, plus il est probable que le coût de la copie qu'elle l'emporte sur la possible de cache du PROCESSEUR de l'utilisation des améliorations.
Ils ont couru un tas de critères de référence pour déterminer le seuil de rentabilité. Et arrivé à 85 000 octets que le point de coupure en cas de copie n'est plus améliore les perf. Avec une exception spéciale pour les tableaux de double, ils sont considérés comme des "gros" quand le tableau a plus de 1000 éléments. C'est une autre optimisation de code 32 bits, le gros tas d'objets allocateur a la propriété particulière qu'il alloue de la mémoire à des adresses qui sont conformes à 8, à la différence de l'ordinaire générationnel allocateur qui n'alloue aligné à 4. Cet alignement est un gros problème pour le double, de la lecture ou de l'écriture d'un mal alignée en double est très cher. Bizarrement les rares Microsoft info ne jamais parler de tableaux de long, pas sûr de ce que ça se fait.
Fwiw, il y a beaucoup de programmeur angoisse sur le tas d'objets volumineux ne pas obtenir compacté. Invariablement, on est déclenchée lorsqu'ils écrivent des programmes qui consomment plus de la moitié de l'ensemble de l'espace d'adressage disponible. Suivi par l'utilisation d'un outil comme un profileur de mémoire, afin de savoir pourquoi le programme bombardé même si il y avait toujours beaucoup de inutilisés de la mémoire virtuelle disponible. Un tel outil montre les trous dans la liturgie des heures, non utilisé des morceaux de mémoire où, auparavant, un objet de grande taille vécu, mais il a obtenu des ordures collectées. Tel est le prix inévitable de la liturgie des heures, le trou ne peut être ré-utilisé par une allocation pour un objet qui est égale ou plus petite en taille. Le vrai problème, c'est en supposant qu'un programme devrait être autorisé à consommer toute la mémoire virtuelle à tout moment.
Un problème qui, autrement, disparaît complètement en exécutant simplement le code sur un système d'exploitation 64 bits. Un processus 64 bits a 8 téra-octets de mémoire virtuelle de l'adresse de l'espace disponible, de 3 ordres de grandeur de plus que d'un processus 32 bits. Vous ne pouvez pas exécuter de trous.
Longue histoire courte, le LOH rend le code de fonctionner plus efficacement. Le coût de l'utilisation de mémoire virtuelle disponible de l'espace d'adresse de moins en moins efficace.
Mise à JOUR, .NET 4.5.1 prend désormais en charge le compactage de la liturgie des heures, GCSettings.LargeObjectHeapCompactionMode de la propriété. Méfiez-vous les conséquences s'il vous plaît.