OVH Cloud OVH Cloud

nettoyer un tableau (array)

3 réponses
Avatar
Bismark Prods
Bonjour,

Est-il plus efficace de faire Array.Clear(xx,xx,xx) ou Redim ?

Merci

Bismark

3 réponses

Avatar
Zazar
Bonjour,

Est-il plus efficace de faire Array.Clear(xx,xx,xx) ou Redim ?



Je suppose que la première méthode est une boucle mettant tous les champs à
null/0, et que la 2ième consiste en une désallocation/allocation de mémoire.
Si c'est le cas : la première méthode est plutôt rapide, tandis qu'allouer
puis réallouer de la mémoire est extrémement couteux. De plus, ça peut
fragmenter la mémoire et impliquer un changement de génération (du point de
vue du GC) de votre tableau (si il était en 0 par exemple, il va se
retrouver en 2 pour peut-être être redéplacer en 1 puis en 0). Autrement le
Array.Clear() est nettement préfèrable.
Cependant, si votre tableau est en dernière génération, à "la fin du tas"
(c'est typiquement le cas, quand c'est le dernier objet à avoir été alloué
et que le GC n'a pas fonctionné depuis (voire même surement s'il a
fonctionné, mais là j'en suis pas certain)), alors la désallocation de la
mémoire/réallocation est assez rapide grâce au modèle de gestion de la
mémoire de .NET. En gros, quand on a plus besoin d'un objet, .NET ne rend
pas la mémoire à l'OS (sauf si la mémoire restante est faible) et la garde
au cas où. Dans cette situation idéale, la désallocation/réallocation se
passera mieux et à mon avis, il est alors possible que pour les très gros
tableaux, le redim soit plus rapide que le Clear; la notion de "très gros"
dépendant de votre PC et de l'OS.
Conclusion : en théorie, il vaut mieux utiliser Array.Clear().
Mais même si là je pense pas m'être trompé, dès qu'on veut comparer des
performances, le mieux c'est d'implémenter les deux solutions, de les faire
tourner dans des conditions réélles d'utilisation et de faire des mesures.

--
Zazar
Avatar
Bismark Prods
Merci c'est très agréable d'avoir des réponses si complète.

Bonne journée

"Zazar" a écrit dans le message
de news:
Bonjour,

> Est-il plus efficace de faire Array.Clear(xx,xx,xx) ou Redim ?

Je suppose que la première méthode est une boucle mettant tous les champs


à
null/0, et que la 2ième consiste en une désallocation/allocation de


mémoire.
Si c'est le cas : la première méthode est plutôt rapide, tandis qu'allouer
puis réallouer de la mémoire est extrémement couteux. De plus, ça peut
fragmenter la mémoire et impliquer un changement de génération (du point


de
vue du GC) de votre tableau (si il était en 0 par exemple, il va se
retrouver en 2 pour peut-être être redéplacer en 1 puis en 0). Autrement


le
Array.Clear() est nettement préfèrable.
Cependant, si votre tableau est en dernière génération, à "la fin du tas"
(c'est typiquement le cas, quand c'est le dernier objet à avoir été alloué
et que le GC n'a pas fonctionné depuis (voire même surement s'il a
fonctionné, mais là j'en suis pas certain)), alors la désallocation de la
mémoire/réallocation est assez rapide grâce au modèle de gestion de la
mémoire de .NET. En gros, quand on a plus besoin d'un objet, .NET ne rend
pas la mémoire à l'OS (sauf si la mémoire restante est faible) et la garde
au cas où. Dans cette situation idéale, la désallocation/réallocation se
passera mieux et à mon avis, il est alors possible que pour les très gros
tableaux, le redim soit plus rapide que le Clear; la notion de "très gros"
dépendant de votre PC et de l'OS.
Conclusion : en théorie, il vaut mieux utiliser Array.Clear().
Mais même si là je pense pas m'être trompé, dès qu'on veut comparer des
performances, le mieux c'est d'implémenter les deux solutions, de les


faire
tourner dans des conditions réélles d'utilisation et de faire des mesures.

--
Zazar




Avatar
Zazar
> Merci c'est très agréable d'avoir des réponses si complète.



Et qui contiennent des erreurs :)

Contrairement à ce que j'ai laissé sous-entendre, les nouveaux objets sont
en génération 0, puis leurs générations augmentent au fur et à mesure des
exécutions du GC.

--
Zazar