Mehrere Wege führen nach Rom in der PowerShell und die Leistungsunterschiede
In Microsofts PowerShell gibt es oft mehrere Wege, um ein Ziel zu erreichen. Dabei gibt es manchmal erhebliche Geschwindigskeitsunterschiede.
- Dr. Holger Schwichtenberg
In Microsofts PowerShell gibt es oft mehrere Wege, um ein Ziel zu erreichen. Dabei gibt es manchmal erhebliche Geschwindigkeitsunterschiede.
In den meisten Praxisszenarien des PowerShell-Einsatzes ist die Geschwindigkeit in der PowerShell wenig relevant. Aber wenn es das doch mal sein sollte, lohnt sich eine Messung mit measure-command!
Dies möchte hier beispielhaft bei Dateisystemoperationen aufzeigen. Zum Auflisten nur von Unterverzeichnissen (Klasse System.IO.DirectoryInfo) innerhalb von Verzeichnissen gibt es mehrere Alternativen:
(new-object System.IO.DirectoryInfo c:\windows).GetDirectories()
dir -Directory
dir | where psiscontainer
dir | where mode -like "*d*"
Auch zum Auflisten nur der Dateien (Klasse System.IO.FileInfo) innerhalb von Verzeichnissen gibt mehrere Alternativen:
(new-object System.IO.DirectoryInfo c:\windows).GetFiles()
dir -file
dir | where psiscontainer -eq $false
dir | where mode -notlike "*d*"
Es gibt vermutlich weitere Alternativen, die mir gerade nicht einfallen. Schreiben Sie gerne weitere alternative Befehle, die Sie kennen, in die Kommentare zu diesem Beitrag.
Wenn man die obigen vier Alternativen vergleicht, kommt man zu den Ergebnissen der folgenden Abbildung.
Klare Erkenntnisse sind dabei:
- Die direkte Verwendung der .NET-Klassenbibliothek ist mit Abstand die schnellste Lösung. Das war zu erwarten, denn die PowerShell-Commandlets sind eine Abstraktion der .NET-Klassenbibliothek.
- Die Commandlets in PowerShell 7 sind deutlich schneller als in Windows PowerShell 5.1.
dir
ist ein Alias für Get-Childitem
. Die direkte Verwendung von Get-Childitem
ergibt keinen messbaren Geschwindigkeitsunterschied.