Ich hatte einige Kommentare zu einem aktuellen Leistungsvergleichsartikel, der gut aufgenommen wurde und mich ermutigte, weitere dieser ähnlichen Artikel zu schreiben. Beginnen wir also ohne weiteres damit, Elemente zu einem Array hinzuzufügen und welcher Ansatz in Bezug auf die Leistung besser wäre.
Normalerweise ist der häufigste Ansatz, den ich beim Hinzufügen von Elementen zu einem Array in PowerShell sehe, die Verwendung des Operators+=.,
$a = @()$a += 'data'$a$a += 'test'$a
Ich musste zuerst das Array initialisieren, sonst würden meine Versuche, den Text hinzuzufügen, stattdessen als verketteten Text behandelt, was ich in diesem Beispiel nicht suche. Wie gesagt, dies ist der übliche Ansatz, den ich sehe, aber ist es notwendigerweise der schnellste Ansatz? Nun, die Antwort ist Nein.
Verwenden einer ArrayList
Die Antwort auf eine bessere Leistung liegt in der Verwendung einer ArrayList. Wie Sie mehr und mehr mit immer bessere Leistung aus Powershell sehen können, werden Sie in der Regel eine Bewegung in Richtung mit einigen sehen .,Net-Instanzen zum Ausführen ähnlicher Vorgänge, die mit tatsächlichen PowerShell-Befehlen oder Operatoren ausgeführt werden können. Etwas, das ich oben getan habe, kann also wie folgt gemacht werden:
$a = New-Object System.Collections.ArrayList$a.Add('data')$a.Add('test')$a
Die 0 und 1, die jedes Mal ausgegeben werden, wenn ich ein Element hinzufüge, geben den Index an, von dem das Element in die Sammlung aufgenommen wurde. Also wurde ‚data ‚am 0-Index hinzugefügt und‘ test ‚ wurde zum 1-Index hinzugefügt. Dies kann meiner Meinung nach ziemlich ärgerlich sein und die Pipeline verschmutzen und unerwünschte Ergebnisse bringen. Sie können dies umgehen, indem Sie sicherstellen, dass Daten an einen Nullspeicherort gesendet werden.,
Wir haben zwei Möglichkeiten, eine Sammlung von Elementen zu erstellen, die vor uns eingerichtet wurden, aber die nächste Frage ist, welche die schnellste ist. Lass es uns herausfinden!
Ich sage nicht, dass ArrayList jedes Mal gewonnen hat…warte, das sage ich! Als die Gesamtzahl der zu jeder Sammlung hinzugefügten Elemente zunahm, nahm auch die Zeit für jeden der Ansätze zu, wobei das += gegen Ende ziemlich dramatisch zunahm. Was mit dem Operator += passiert, ist, dass bei jeder Verwendung des Operators tatsächlich ein neues Array erstellt wird, damit das neue Element zur Sammlung hinzugefügt werden kann., Nicht gerade effizient, aber es erledigt die Arbeit. Sie werden das mit dem ArrayList-Ansatz nicht finden, da er das Element direkt in die Sammlung einfügt.
Wie bei jeder dieser Arten von Leistungstests habe ich die einfachen bis extremen Situationen abgedeckt, wenn Sie also unbedingt jede mögliche Millisekunde aus Ihren PowerShell-Skripten herauspressen möchten, dann würden Sie auf jeden Fall den ArrayList-Ansatz betrachten wollen.