2009-02-09 9 views
2

Garbage Collection dans .NET conduit beaucoup à croire que les objets légers peuvent être traités comme temporaires. Cela semble particulièrement vrai pour les tableaux qui contiennent des références d'objets à des objets qui sont instanciés en dehors du contexte de l'initialisation du tableau. Par conséquent, il semblerait que cela ne devrait pas vraiment avoir d'importance si un nouveau tableau est initialisé dans une itération d'un automate fini, en particulier si cet état bloque de quelque façon que ce soit, par exemple avec un appel à WaitHandle.WaitAny(). Je préfèrerais créer un nouveau tableau en tant que conteneur léger à la volée pour contenir mes objets WaitHandle, plutôt que de redimensionner le tableau WaitHandle[] en utilisant Array.Resize<T>().Gestion de la mémoire - devrais-je m'inquiéter de redimensionner un tableau temporaire d'objets de longue durée dans une machine d'état?

Pourquoi? Eh bien, en supposant que la mémoire est bon marché et que Array.Resize<T>() devra effectuer une allocation de mémoire ou une copie de mémoire de toute façon, il semble plus efficace de rejeter simplement le tableau implicitement en passant un nouveau dans la méthode statique comme ceci :

// using C# 3.0 array initialization syntax 
eventIndex = WaitHandle.WaitAny(new[] { _stateStopEvent }, 5000); 

(Consultez ce link pour plus de détails sur la syntaxe de tableau)

_stateStopEvent est l'un des événements potentiels qui peuvent s'appliquer à tout ou partie des états, et ces objets ManualResetEvent sont déclarés à périmètre supérieur , il semble donc que la gestion du tableau est en fait plus de travail que cela en vaut la peine.

En outre, si le code déclare une variable de référence temporaire pour le tableau et lui attribue simplement une nouvelle instance de tableau dans chaque itération de la machine d'état, quelle est la différence, du point de vue de la performance? Pourquoi ne pas simplement ignorer cette étape comme indiqué dans l'extrait de code ci-dessus?

Redimensionner le tableau WaitHandle[] en utilisant Array.Resize<T>(), une meilleure approche? En prenant des tableaux byte [] hors de l'image, si je dois redimensionner un tableau, ne devrais-je pas utiliser une instance List ou Dictionary comme cela est recommandé here?

Répondre

1

C'est ce que Array.Resize fait:

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
public static void Resize<T>(ref T[] array, int newSize) 
{ 
    if (newSize < 0) 
    { 
     throw new ArgumentOutOfRangeException("newSize", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); 
    } 
    T[] sourceArray = array; 
    if (sourceArray == null) 
    { 
     array = new T[newSize]; 
    } 
    else if (sourceArray.Length != newSize) 
    { 
     T[] destinationArray = new T[newSize]; 
     Copy(sourceArray, 0, destinationArray, 0, (sourceArray.Length > newSize) ? newSize : sourceArray.Length); 
     array = destinationArray; 
    } 
} 

Ainsi, en plus des vérifications de la plage, il crée simplement un nouveau tableau et copie les éléments du tableau précédent au nouveau tableau.

+0

C'est beaucoup de code supplémentaire pour quelque chose que je peux réaliser dans cet exemple dans une ligne de code. –

Questions connexes