PowerShell : Array vs. ArrayList Performance.
En février 2017 je twittais cet article : PowerShell – Array vs. ArrayList Performance (dont je ne suis pas l’auteur). Cet article établissait une comparaison sur la performance (en termes de temps d’exécution) lors de l’ajout de 100 000 éléments dans un tableau PowerShell en comparaison avec la même opération dans une ArrayList (object .Net : System.Collections.ArrayList). Le résultat étant largement en faveur de la ArrayList : En effet les tableaux sont des objets de taille fixe et le fait de rajouter un élement dans un tableau équivaut à recréer un nouveau tableau de taille n+1 et de recopier le contenu existant dans cette nouvelle structure (Autant dire que c’est une opération coûteuse).
Je ne suis donc demandé à quel point la performance décroit (d’un point de vue des tableaux PowerShell) en fonction du nombre des éléments à ajouter. J’ai donc créé un petit script PowerShell qui ajoute jusquà 100 000 élements dans un tableau (en partant de 0 et par pallier de 100). De manière à ne pas perturber le script je l’ai lancé sur une VM Azure vierge (Standard A3 : 4 Cœurs, mémoire 7 Go).
Je vous laisse juge des résultats ci-dessous (Le fichier Excel des résultats est également disponible ici).
Comparaison des temps d’exécution
La courbe orange (Tableau PowerShell) inque clairement que plus on ajoute des éléments dans un tableau plus le temps augmente (de manière exponentielle – On atteint 24 minutes pour 100 000 élements).
Notez au passage la courbe bleue au niveau des abscisses (X = Nombre d’élements; Y= Temps exprimé en ticks soit 0.0001 ms) qui correspond au temps d’un point de vue ArrayList
Zoom : Temps d’exécution côté ArrayList
Si on zoome sur la courbe bleue (ArrayList) on constate que l’évolution est linéaire (ce que ne laisse pas deviner la première courbe). On atteint moins de 2 secondes (!) pour 100 000 élements.
Ecart
L’écart Array vs. ArrayList lui aussi grandit en fonction du nombre d’élements. On constate donc que plus le nombre d’élements à ajouter et grand et plus les tabelaux sont a proscrire (on pouvait déjà tirer cette conclusion du premier graphique).
En conclusion : Bannissez l’utilisation des tableaux en PowerShell pour des structures de grandes tailles.
In February 2017 I twitted this article : PowerShell – Array vs. ArrayList Performance (I am not the author). This article compares performance (in terms of execution time) when adding 100,000 items into a PowerShell array as compared to the same operation in an ArrayList (object .Net: System.Collections.ArrayList) . The result is largely in favor of the ArrayList: Indeed arrays are objects of fixed size and the fact of adding an element in a table is equivalent to recreate a new table with the size n + 1 and copy the existing content in this new structure (which means that it is an expensive operation).
So I'm wondering how much the performance decreases (from a PowerShell tables perspective) depending on the number of elements to add. So I created a little PowerShell script that adds up to 100,000 elements in a table (from 0 to 100). So as not to disturb the script I launched it on a blank Azure VM (Standard A3: 4 cores, 7 GB memory)
I leave you judge of the results below (The Excel file of the results is also available here).
Comparison of execution times
The orange curve (PowerShell Table) clearly indicates that the more elements are added to a table the more time increases (exponentially - 24 minutes for 100,000 elements).
Note in passing the blue curve at the abscissa (X = number of elements, Y = time expressed in ticks or 0.0001 ms) which corresponds to the time from an ArrayList point of view
Zoom : Execution time from an ArrayList point of view
If we zoom in on the blue curve (ArrayList) we see that the evolution is linear (which is not to be guessed by the first curve). We reach less than 2 seconds (!) for 100,000 elements.
Gap
The difference Array vs. ArrayList also grows according to the number of elements. So we see that the more elements to add and larger and the more tables are to be avoided (we could already draw this conclusion from the first graph).
In conclusion: Ban the use of tables in PowerShell for large structures.
Laurent.