Comment rapidement éliminer un tableau?

Je le fais actuellement dans une boucle for, et je sais qu’en C, il y a l’API ZeroMemory, mais cela ne semble pas être disponible en C #. Il n’existe pas non plus le Array.fill quelque peu équivalent de Java. Je me demande simplement s’il existe un moyen plus facile / plus rapide?

Essayez Array.Clear () :

Définit une plage d’éléments dans le tableau sur zéro, sur false ou sur null (Nothing en Visual Basic), selon le type d’élément.

  • C ++: memset(array, 0, array_length_in_bytes);

  • C ++ 11: array.fill(0);

  • C #: Array.Clear(array, startingIndex, length);

  • Java: Arrays.fill(array, value);

 Array.Clear(integerArray, 0, integerArray.Length); 

Plusieurs personnes ont posté des réponses, puis les ont supprimées, en disant que dans n’importe quelle langue, une boucle for sera aussi performante qu’un memset, une FillMemory ou autre.

Par exemple, un compilateur peut le découper en morceaux alignés sur 64 bits pour tirer parti d’une instruction d’atsortingbution zéro de 64 bits, si elle est disponible. Il faudra tenir compte de l’alignement et des choses. La mise en œuvre de Memset n’est certainement pas sortingviale.

un memset.asm . Voir aussi memset-is-rapid-than-simple-loop.html .

Ne jamais sous-estimer l’infinie sournoise des compilateurs et des auteurs de bibliothèques standard.

METTRE À JOUR

Sur la base du benchmark concernant les Array.Clear() de Array.Clear() et array[x] = default(T) , nous pouvons affirmer que deux cas majeurs doivent être pris en compte lors de la mise à zéro d’un tableau:

A) Il y a un tableau de 1..76 éléments long ;

B) Il existe un tableau de 77 éléments ou plus .

La ligne orange sur le tracé représente Array.Clear() approche Array.Clear() .

La ligne bleue sur le tracé représente le array[x] = default(T) approche array[x] = default(T) (itération sur le tableau et définition des valeurs par default(T) ).

entrer la description de l'image ici

Vous pouvez écrire une fois un assistant pour faire ce travail, comme ceci:

 public static class ArrayHelper { // Performance-oriented algorithm selection public static void SelfSetToDefaults(this T[] sourceArray) { if (sourceArray.Length <= 76) { for (int i = 0; i < sourceArray.Length; i++) { sourceArray[i] = default(T); } } else { // 77+ Array.Clear( array: sourceArray, index: 0, length: sourceArray.Length); } } } 

Usage:

 someArray.SelfSetToDefaults(); 

Appeler la méthode en utilisant dll import.It rapide et facile à utiliser 🙂

  [DllImport("msvcrt.dll", EntryPoint = "memset", CallingConvention = CallingConvention.Cdecl, SetLastError = false)] public static extern IntPtr MemSet(IntPtr dest, int c, int byteCount); 

c est la valeur que vous voulez définir dans la mémoire

OU

 [DllImport("kernel32.dll", EntryPoint="RtlZeroMemory")] public unsafe static extern bool ZeroMemory(byte* destination, int length); 

cela définit uniquement le tableau donné à zéro