Contrairement à de nombreux langages, C# (mais aussi VB.NET et F#) disposent d’un support pour les tableaux multidimensionnels. Ainsi, au lieur d’écrire :
double[][] a = new double[n][];
for (int i = 0; i<n; i++)
a[i] = new double[n];
on peut écrire :
double[,] a = new double[n, n];
ce qui simplifie un peu l’écriture et a l’avantage d’avoir un tableau parfaitement rectangulaire par opposition à un tableau irrégulier (jagged array en anglais).
On pourrait s’attendre à ce que ces tableaux multidimensionnels soient plus performants que des tableaux irréguliers, puisqu’il n’y a qu’un seul new à faire, et que l’accès aux valeurs résulte d’une simple opération de type a + b * c.
Hélas, ces tableaux multidimensionnels doivent être absolument évités (en attendant que l’équipe responsable des SDK .NET se penche sur ce sujet). En effet, quelques pages parlent de ce sujet :
- https://stackoverflow.com/questions/468832/why-are-multi-dimensional-arrays-in-net-slower-than-normal-arrays
- https://blog.tedd.no/2021/10/07/why-c-multidimensional-arrays-are-slow/
- https://dev.to/vercidium/improving-performance-of-multidimensional-arrays-in-c-4e9b
En étudiant plb2 sur Github qui est un code destiné à étudier les performances de quelques algorithmes pour 25 langages, j’ai voulu étudier la variation de performance pour les différents types de tableaux, notamment, pour le cas de la multiplication de 2 matrices utilisant l’algorithme naïf.
Voici le code de base qui initialise 2 tableaux (de dimension 1000 par 1000) et effectue la multiplication matricielle le tout en utilisant des tableaux irréguliers :
Et le code équivalent avec des tableaux multidimensionnels :
Or, l’écart de performance est d’un facteur d’environ 3 (environ 1300 ms pour le premier cas et environ 4000 ms dans le second cas sur une machine de test en mode Release et .NET 8, sous Windows), ce qui est loin d’être négligeable.
Donc il est préférable se contenter de la syntaxe verbeuse des tableaux irréguliers.
Laisser un commentaire