Czy istnieje prosty sposób na czas wykonania polecenia w programie PowerShell, taki jak polecenie „time” w systemie Linux?
Wymyśliłem to:
$s=Get-Date; .\do_something.ps1 ; $e=Get-Date; ($e - $s).TotalSeconds
Ale chciałbym coś prostszego
time .\do_something.ps1
powershell
time
performance-testing
Paolo Tedesco
źródło
źródło
time { ping -n 1 google.com } -Samples 10
uruchomi10
czasy poleceń i zwróci średni, minimalny i maksymalny czas. Możesz dodać,-Silent
aby połknąć STDOUT.$t = Measure-Command {<<your command or code block>>}
. Wypróbuj go, a następnie wpisać$t
w linii poleceń, aby zobaczyć swoje wyniki i wszystkie właściwości, które mają dostęp do, jak$t.Milliseconds
,$t.TotalSeconds
itp wtedy możemy napisać cokolwiek wyjście chcemy, na przykładWrite-Host That command took $t.TotalSeconds to complete.
Możesz także pobrać ostatnie polecenie z historii i odjąć je
EndExecutionTime
od niegoStartExecutionTime
.źródło
Get-History | Group {$_.StartExecutionTime.Hour} | sort Count -desc
aby zobaczyć swój wzór użycia PowerShell według godziny. :-)$command = Get-History -Count 1 ; "{0}" -f ($command.EndExecutionTime - $command.StartExecutionTime)
Posługiwać się
Measure-Command
Przykład
Potok do
Out-Host
pozwala zobaczyć dane wyjściowe polecenia, które w przeciwnym razie jest zużywaneMeasure-Command
.źródło
Measure-Command {<your command } | Out-Host
- Out-Host znajduje się poza blokiem skryptówSimples
następnie można użyć jako
Możesz dostosować dane wyjściowe
źródło
Measure-Command
ukrywa dane wyjściowe polecenia, więc to rozwiązanie jest czasem lepsze.Oto funkcja, którą napisałem, która działa podobnie do
time
polecenia Unix :Źródło: https://gist.github.com/bender-the-greatest/741f696d965ed9728dc6287bdd336874
źródło
Measure-Command
lub jednego z wielu innych sposobów wykonywania czasu w programie Powershell. Jeśli przeczytasz oryginalne pytanie, poprosił o coś, co działa „jaktime
polecenie w Linuksie”.Korzystanie ze stopera i formatowanie upływającego czasu:
Próbki użycia
źródło
Tylko słowo na temat wyciągania (niepoprawnych) wniosków z dowolnych poleceń pomiaru wydajności, o których mowa w odpowiedziach. Istnieje szereg pułapek, które należy wziąć pod uwagę oprócz patrzenia na sam czas wywołania (niestandardowej) funkcji lub polecenia.
Sjoemelsoftware
Osobiście uważam, że „ Sjoemelsoftware ” nie zawsze jest celowo tworzone w celu oszukiwania wyników testów, ale może wynikać z przystosowania się do praktycznej sytuacji podobnej do przypadków testowych, jak pokazano poniżej.
Jako przykład, za pomocą poleceń wymienionych pomiarów wydajności, LINQ (LINQ) (1) , jest często kwalifikowane jako na czczo sposób coś zrobić i to często jest, ale na pewno nie zawsze! Każdy, kto mierzy wzrost prędkości o współczynnik 40 lub więcej w porównaniu z natywnymi poleceniami PowerShell, prawdopodobnie nieprawidłowo mierzy lub wyciąga błędne wnioski.
Chodzi o to, że niektóre klasy .Net (jak LINQ) używają leniwej oceny (zwanej także odroczonym wykonaniem (2) ). Oznacza to, że przypisanie wyrażenia do zmiennej wydaje się prawie natychmiastowe, ale w rzeczywistości nic jeszcze nie przetworzyło!
Załóżmy, że wklejasz swoje
. .\Dosomething.ps1
polecenie, które ma albo PowerShell albo bardziej wyrafinowane wyrażenie Linq (dla ułatwienia wyjaśnienia, bezpośrednio osadziłem wyrażenia bezpośrednio wMeasure-Command
):Wynik wydaje się oczywisty, późniejsze polecenie Linq jest około 40 razy szybsze niż pierwsze polecenie PowerShell . Niestety nie jest to takie proste ...
Wyświetlmy wyniki:
Zgodnie z oczekiwaniami wyniki są takie same, ale jeśli zwrócisz szczególną uwagę, zauważysz, że wyświetlenie
$Linq
wyników zajęło dużo więcej czasu niż$PowerShell
wyników.Zmierzmy to konkretnie , po prostu pobierając właściwość wynikowego obiektu:
Pobranie właściwości obiektu niż obiektu zajęło około 90 razy dłużej i był to tylko jeden obiekt!
$Linq
$PowerShell
Zauważ też inną pułapkę, że jeśli zrobisz to ponownie, niektóre kroki mogą pojawić się znacznie szybciej niż wcześniej, ponieważ niektóre wyrażenia zostały buforowane.
Podsumowując, jeśli chcesz porównać wydajność między dwiema funkcjami, musisz zaimplementować je w używanym przypadku, rozpocząć od nowej sesji PowerShell i oprzeć swój wniosek na rzeczywistej wydajności kompletnego rozwiązania.
(1) Aby uzyskać więcej informacji na temat PowerShell i LINQ, i przykładów, polecam tihis site: High Performance PowerShell with LINQ
(2) Myślę, że istnieje niewielka różnica między tymi dwiema koncepcjami, ponieważ w przypadku leniwej oceny wynik jest obliczany, gdy jest potrzebny, w odniesieniu do odroczone wykonanie , gdy wynik jest obliczany, gdy system jest bezczynny
źródło