Gibt es eine einfache Möglichkeit, die Ausführung eines Befehls in PowerShell zeitlich zu steuern, wie den Befehl 'time' unter Linux?
Ich habe mir das ausgedacht:
$s=Get-Date; .\do_something.ps1 ; $e=Get-Date; ($e - $s).TotalSeconds
Aber ich hätte gerne etwas Einfacheres
time .\do_something.ps1
powershell
time
performance-testing
Paolo Tedesco
quelle
quelle
time { ping -n 1 google.com } -Samples 10
die Befehlszeiten aus10
und gibt die durchschnittliche, minimale und maximale Zeit zurück. Sie können hinzufügen,-Silent
um STDOUT zu schlucken.$t = Measure-Command {<<your command or code block>>}
. Probieren Sie es aus und geben Sie dann$t
an der Eingabeaufforderung Ihre Ergebnisse zu sehen und alle Eigenschaften , die Sie Zugriff haben, wie$t.Milliseconds
,$t.TotalSeconds
usw. Dann können wir schreiben , was auch immer Ausgabe wollen wir zum BeispielWrite-Host That command took $t.TotalSeconds to complete.
Sie können auch den letzten Befehl aus dem Verlauf abrufen und
EndExecutionTime
von seinem subtrahierenStartExecutionTime
.quelle
Get-History | Group {$_.StartExecutionTime.Hour} | sort Count -desc
Zeigen Sie Ihr PowerShell-Nutzungsmuster nach Tageszeit an. :-)$command = Get-History -Count 1 ; "{0}" -f ($command.EndExecutionTime - $command.StartExecutionTime)
Verwenden
Measure-Command
Beispiel
Mit der Pipe to
Out-Host
können Sie die Ausgabe des Befehls anzeigen, der ansonsten von verwendet wirdMeasure-Command
.quelle
Measure-Command {<your command } | Out-Host
- der Out-Host ist außerhalb des SkriptblocksEinfache
kann dann als verwenden
Möglicherweise möchten Sie die Ausgabe optimieren
quelle
Measure-Command
verbirgt die Befehlsausgabe, daher ist diese Lösung manchmal besser.Hier ist eine Funktion, die ich geschrieben habe und die ähnlich wie der Unix-
time
Befehl funktioniert :Quelle: https://gist.github.com/bender-the-greatest/741f696d965ed9728dc6287bdd336874
quelle
Measure-Command
können, anstatt eine oder eine der verschiedenen anderen Möglichkeiten zu verwenden, wie Sie die Ausführung in Powershell zeitlich festlegen können. Wenn Sie die ursprüngliche Frage gelesen haben, hat er nach etwas gefragt, das "wie dertime
Befehl unter Linux" funktioniert .Verwenden der Stoppuhr und Formatieren der verstrichenen Zeit:
Verwendungsbeispiele
quelle
Nur ein Wort zum Ziehen (falscher) Schlussfolgerungen aus einem der in den Antworten genannten Leistungsmessbefehle. Es gibt eine Reihe von Fallstricken, die berücksichtigt werden sollten, abgesehen von der bloßen Aufrufzeit einer (benutzerdefinierten) Funktion oder eines Befehls.
Sjoemelsoftware
Persönlich denke ich, dass " Sjoemelsoftware " nicht immer absichtlich erstellt wurde, um Testergebnisse zu betrügen, sondern möglicherweise aus einer praktischen Situation resultiert, die den unten gezeigten Testfällen ähnelt.
Beispielsweise wird die Verwendung der aufgelisteten Leistungsmessbefehle, Language Integrated Query (LINQ) (1) , häufig als der schnellste Weg bezeichnet, um etwas zu erledigen, und dies ist häufig der Fall, aber sicherlich nicht immer! Jeder, der eine Geschwindigkeitssteigerung um den Faktor 40 oder mehr im Vergleich zu nativen PowerShell-Befehlen misst, misst wahrscheinlich falsch oder zieht eine falsche Schlussfolgerung.
Der Punkt ist, dass einige .Net-Klassen (wie LINQ) eine verzögerte Auswertung verwenden (auch als verzögerte Ausführung bezeichnet (2) ). Das heißt, wenn Sie einer Variablen einen Ausdruck zuweisen, scheint dies fast sofort erledigt zu sein, aber tatsächlich wurde noch nichts verarbeitet!
Lassen Sie vermuten , dass Sie dot-Quelle Ihren
. .\Dosomething.ps1
Befehl , die entweder eine Powershell oder ein anspruchsvolleres Linq Ausdruck hat (für die Einfachheit der Erklärung, habe ich direkt die Ausdrücke direkt in die eingebettetMeasure-Command
):Das Ergebnis scheint offensichtlich zu sein. Der spätere Linq- Befehl ist etwa 40-mal schneller als der erste PowerShell- Befehl. Leider ist es nicht so einfach ...
Lassen Sie uns die Ergebnisse anzeigen:
Wie erwartet sind die Ergebnisse dieselben, aber wenn Sie genau aufgepasst haben, werden Sie feststellen, dass die Anzeige der
$Linq
Ergebnisse viel länger gedauert hat als die$PowerShell
Ergebnisse.Lassen Sie uns dies speziell messen , indem wir nur eine Eigenschaft des resultierenden Objekts abrufen:
Das Abrufen einer Eigenschaft des Objekts dauerte etwa einen Faktor 90 länger als das Abrufen
$Linq
des$PowerShell
Objekts, und das war nur ein einzelnes Objekt!Beachten Sie auch eine andere Gefahr, dass bestimmte Schritte bei einem erneuten Ausführen möglicherweise viel schneller als zuvor angezeigt werden. Dies liegt daran, dass einige der Ausdrücke zwischengespeichert wurden.
Fazit: Wenn Sie die Leistung zwischen zwei Funktionen vergleichen möchten, müssen Sie diese in Ihrem verwendeten Fall implementieren, mit einer neuen PowerShell-Sitzung beginnen und Ihre Schlussfolgerung auf die tatsächliche Leistung der gesamten Lösung stützen.
(1) Für weitere Hintergrundinformationen und Beispiele zu PowerShell und LINQ empfehle ich diese Website: Hochleistungs-PowerShell mit LINQ
(2) Ich denke, es gibt einen geringfügigen Unterschied zwischen den beiden Konzepten, da bei einer verzögerten Bewertung das Ergebnis bei Bedarf berechnet wird Aufgeschobene Ausführung , wenn das Ergebnis berechnet wird, wenn das System inaktiv ist
quelle