Question

Poursuivre le débat de Comprendre VS2010 C # en parallèle les résultats de profilage mais plus à le point:

J'ai beaucoup de fils qui travaillent en parallèle (en utilisant Parallel.For / chacun), qui utilisent de nombreuses allocations de mémoire pour les petites classes.

Cela crée une affirmation sur le fil global allocateur de mémoire.

Y at-il un moyen de Instruire .NET preallocate un pool de mémoire pour chaque fil et faire toutes les allocations de ce pool?

À l'heure actuelle ma solution est ma propre implémentation de pools de mémoire (tableaux attribués globalement d'objets de type T, qui sont recyclés parmi les fils) qui aide beaucoup, mais n'est pas efficace parce que:

  1. Je ne peux pas Instruire .NET d'allouer à partir d'une tranche de mémoire spécifique.
  2. Je encore besoin d'appeler nouveau beaucoup fois pour allouer la mémoire pour les piscines.

Merci,
Haggai

Était-ce utile?

La solution

Je recherche pendant deux jours à essayer de trouver une réponse à la même question que vous aviez. La réponse est que vous devez définir le mode de collecte des déchets en mode serveur. Par défaut, le mode collecte des ordures appareil en mode station de travail. collecte des ordures Réglage en mode serveur provoque le tas managé à se diviser en sections gérées séparément, un par CPU. Pour ce faire, vous devez ajouter un paramètre de configuration à votre fichier app.config.

<runtime>
   <gcServer enabled="true"/>
</runtime>

La différence de vitesse sur mon 12-core Opteron 6172 était! Dramatique

Autres conseils

Le garbage collector n'alloue pas de mémoire.

Il ressemble plus à vous allouer beaucoup de petits objets temporaires et quelques objets de longue durée, et le collecteur des ordures passe beaucoup de temps de collecte des ordures les objets temporaires afin que votre application n'a pas à demander plus la mémoire du système d'exploitation. De .NET Framework 4 Advanced Development - Collection de Garbage :

  

Tant que l'espace d'adressage est disponible dans le tas managé, le moteur d'exécution continue d'allouer de l'espace pour de nouveaux objets. Cependant, la mémoire n'est pas infinie. Finalement, le garbage collector doit effectuer une collection afin de libérer de la mémoire.

La solution:. Ne pas allouer beaucoup de petits objets temporaires La page sur collecte des ordures et performance pourrait également être utile.

Vous pourriez pré-allouer un tas d'objets, et les conserver dans des groupes destinés à des threads séparés. Cependant, il est probable que vous n'obtiendrez une meilleure performance de cette situation.

Le garbage collector est spécialement conçu pour manipuler des petits objets vécu court efficacement. Si vous gardez les objets dans une piscine, ils sont de longue durée et survivront à une collecte des ordures, qui signifie des tours qu'ils seront copiés dans le deuxième tas de génération. Cette copie sera plus cher qu'un simple attribution de nouveaux objets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top