En règle générale, la collecte des ordures est un espace/temps de compromis. Donner la GC de plus d'espace, et cela prendra moins de temps. Il y a (beaucoup) d'autres facteurs en jeu, cache en particulier, mais de l'espace/temps des compromis est le plus important.
Le compromis fonctionne comme ceci: le programme alloue de la mémoire jusqu'à ce qu'il atteint une certaine limite (décidé par le conseil d'administration automatique des paramètres de réglage, ou explicitement par la RTS options). Lorsque la limite est atteinte, le GC traces de toutes les données que le programme est en cours d'utilisation, et libère la mémoire utilisée par les données qui ne sont plus nécessaires. Le plus vous pouvez retarder ce processus, plus les données seront devenus inaccessible ("mort") dans l'intervalle, de sorte que le GC évite la vectorisation de données. Le seul moyen de retarder un GC est pour libérer de la mémoire à allouer en; par conséquent, plus la mémoire est égale à moins de GCs, est égale à une baisse GC frais généraux. Grosso modo, GHC l'option-H permet de définir une limite inférieure sur la quantité de mémoire utilisée par le GC, donc peut réduire le GC frais généraux.
GHC utilise un générationnelle GC, qui est une optimisation pour le régime de base, dans lequel le segment de mémoire est divisé en deux générations ou plus. Les objets sont répartis dans la "jeune" génération, et ceux qui vivent assez longtemps à obtenir une promotion dans la "vieille" génération (dans un 2-génération de l'installation). La jeune génération est recueilli beaucoup plus fréquemment que l'ancienne génération, l'idée étant que "la plupart des objets mourir jeune", si jeune génération collections sont bon marché (ils n'ont pas trace de la quantité de données), mais ils récupérer beaucoup de mémoire. Grosso modo, l'option-A permet de définir la taille de la jeune génération - qui est, la quantité de mémoire qui vous seront attribués avant la jeune génération est recueillie.
La valeur par défaut pour -Un est 512k: c'est une bonne idée de garder la jeune génération plus petit que le cache L2, et les performances en général gouttes si vous dépassez la taille du cache L2. Mais le fait de travailler dans la direction opposée est la GC de l'espace/temps de compromis: à l'aide d'un très grand jeune génération de la taille, peut dépasser le cache, en réduisant la quantité de travail que le GC a à faire. Cela n'arrive pas toujours, cela dépend de la dynamique de l'application, ce qui rend difficile pour la GC pour syntoniser automatiquement lui-même. L'option-H augmente également la jeune génération de la taille, peut donc également avoir un effet négatif sur l'utilisation du cache.
La ligne de fond est: jouer avec les options et voir ce qui fonctionne. Si vous avez une quantité de mémoire importante, vous pourriez bien être en mesure d'obtenir une augmentation de la performance en utilisant Un ou-H, mais pas nécessairement.