2017-05-23 1 views
0

Si j'ai un tableau multidimensionnel avec plusieurs centaines de milliers d'entrées et que toutes les entrées sont des objets de longue durée (c.-à-d. Créés une seule fois pour toute la durée de l'application), y at-il à envisager? Est-ce que cela aura une incidence sur le temps que mettra le GC à terminer? Cela affectera-t-il les affectations/désallocations futures? Pour le contexte, j'essaie de prendre une décision entre l'utilisation d'un large éventail de classes ou un large éventail de structures.Quelles sont les implications du GC d'avoir un large éventail de petites classes?

+0

Vous ne savez pas exactement ce que vous demandez - p. En considérant l'utilisation de classes vs structures, quels sont vos arguments ou dilemmes dans l'un ou l'autre? Vous parlez d'allocations futures, mais vous avez dit que la durée de vie est la durée de l'application, donc elle n'applique aucune réallocation future du tableau. – LB2

+0

@ LB2 La principale caractéristique de ma question est les implications GC d'un grand nombre de petites classes. Le contexte que j'ai fourni n'était que des informations auxiliaires dont vous n'avez pas vraiment besoin. J'ai trouvé via le profilage que mon algorithme fonctionne mieux sur un large éventail de classes au lieu de structures et que je veux m'assurer que je ne néglige pas quelque chose. L'état des affectations s'appliquait aux nouvelles allocations en général; pas ceux spécifiques à la grande variété de classes. – Slight

Répondre

1

Si ces petites classes ont une longue durée de vie, elles seront bientôt promues en objets Gen2 et n'affecteront pas la collection Gen0 et Gen1. Ils n'affecteront pas l'allocation. Ils affecteront cependant la collection Gen2, mais si GC fait la collection Gen2, alors vous avez un problème différent. Vous manquez de mémoire. En plus d'affecter GC, classe vs struct affecteront la disposition de la mémoire de vos objets. Cela affectera les performances du cache de l'UC, ce qui peut avoir un impact plus important sur les performances.

+0

Ceci est utile, merci. J'ai trouvé jusqu'à présent via le profilage que le grand nombre de classes tend à courir ~ 20% plus vite en raison de l'élimination de la surcharge de copie struct dans mon cas d'utilisation. J'étais surtout préoccupé par les performances cachées que je ne mesurais pas. Je vais laisser cette question ouverte un peu plus longtemps avant d'accepter. – Slight

1

Un objet de taille suffisante est alloué en Large Object Heap (LOH) qui n'est pas collecté de la même manière que les allocations de tas ordinaires. Les objets dans LOH ne sont pas compactés normalement, il est donc plus facile de se retrouver avec une mémoire fragmentée, et donc beaucoup plus de chances d'obtenir OutOfMemoryException même si votre processus n'utilise pas beaucoup de mémoire (mon expérience était de 700MB) sur un processus 32 bits pourrait assez facilement rencontrer une telle condition lorsqu'il s'agit de beaucoup de gros objets). La raison pour laquelle je demandais au sujet des allocations futures est que si c'est le seul gros objet que vous attendez dans votre programme et qu'il n'est pas souvent réaffecté avec d'autres, alors en avoir un ou quelques-uns n'est probablement pas un gros problème. peu susceptible de vous affecter trop. C'est bien d'avoir de gros objets tels que des tableaux massifs ou de grosses chaînes. Si les allocations nécessitant LOH sont assez fréquentes, cela peut être une source de préoccupation.

Struct vs objets. Les objets font évidemment de la largeur d'un tableau la même taille que le pointeur, c'est-à-dire 32 ou 64 bits. Les structures peuvent être stockées sous la forme de la valeur elle-même dans le tableau, donc si la structure est plus grande, alors un tableau de la même taille sera plus gros sur le plan des octets. Par conséquent, un plus petit nombre d'éléments entraînera l'allocation d'un tableau en LOH.

+0

Merci pour l'information, je l'ai trouvé utile. Le tableau sera attribué une fois et plus jamais et vivra pour toujours. – Slight