Existe uma maneira simples de cronometrar a execução de um comando no PowerShell, como o comando 'time' no Linux?
Eu vim com isso:
$s=Get-Date; .\do_something.ps1 ; $e=Get-Date; ($e - $s).TotalSeconds
Mas eu gostaria de algo mais simples como
time .\do_something.ps1
powershell
time
performance-testing
Paolo Tedesco
fonte
fonte
time { ping -n 1 google.com } -Samples 10
executará os10
tempos de comando e retornará o tempo médio, mínimo e máximo necessário. Você pode adicionar-Silent
para engolir STDOUT.$t = Measure-Command {<<your command or code block>>}
. Experimentá-lo e, em seguida, digite$t
na linha de comando para ver os resultados e todas as propriedades que têm acesso, como$t.Milliseconds
,$t.TotalSeconds
, etc. Então, podemos escrever a qualquer saída que queremos, por exemplo,Write-Host That command took $t.TotalSeconds to complete.
Você também pode obter o último comando do histórico e subtraí-lo
EndExecutionTime
do seuStartExecutionTime
.fonte
Get-History | Group {$_.StartExecutionTime.Hour} | sort Count -desc
para ver seu padrão de uso do PowerShell por hora do dia. :-)$command = Get-History -Count 1 ; "{0}" -f ($command.EndExecutionTime - $command.StartExecutionTime)
Usar
Measure-Command
Exemplo
O canal para
Out-Host
permite ver a saída do comando, que é consumido de outra formaMeasure-Command
.fonte
Measure-Command {<your command } | Out-Host
- o Out-Host está fora do bloco de scriptSimples
então pode usar como
Você pode querer ajustar a saída
fonte
Measure-Command
oculta a saída do comando, então essa solução às vezes é melhor.Aqui está uma função que escrevi que funciona de maneira semelhante ao
time
comando Unix :Fonte: https://gist.github.com/bender-the-greatest/741f696d965ed9728dc6287bdd336874
fonte
Measure-Command
ou uma das várias outras maneiras pelas quais você pode executar o tempo no Powershell. Se você leu a pergunta original, ele pediu algo que funcionasse "como otime
comando no Linux".Usando o cronômetro e formatação do tempo decorrido:
Amostras de uso
fonte
Apenas uma palavra sobre como tirar conclusões (incorretas) de qualquer um dos comandos de medição de desempenho mencionados nas respostas. Há várias armadilhas que devem ser levadas em consideração, além de considerar o tempo de invocação simples de uma função ou comando (personalizado).
Sjoemelsoftware
Pessoalmente, acho que o " Sjoemelsoftware " nem sempre é criado deliberadamente para enganar os resultados dos testes, mas pode ter origem em acomodar situações práticas semelhantes aos casos de teste, como mostrado abaixo.
Como exemplo, usando os comandos de medição de desempenho listados, Language Integrated Query (LINQ) (1) , é frequentemente qualificado como a maneira mais rápida de fazer alguma coisa e geralmente é, mas certamente nem sempre! Quem mede um aumento de velocidade de um fator 40 ou mais em comparação com os comandos nativos do PowerShell, provavelmente está medindo incorretamente ou tirando uma conclusão incorreta.
O ponto é que algumas classes .Net (como LINQ) usando uma avaliação lenta (também chamada de execução adiada) (2) ). Isso significa que, quando atribui uma expressão a uma variável, ela quase imediatamente parece ter sido executada, mas na verdade ainda não processou nada!
Vamos supor que você pontue sua fonte
. .\Dosomething.ps1
comando que possui uma expressão do PowerShell ou uma Linq mais sofisticada (para facilitar a explicação, integrei diretamente as expressões diretamente noMeasure-Command
):O resultado parece óbvio, o comando Linq posterior é cerca de 40 vezes mais rápido que o primeiro PowerShell comando do . Infelizmente, não é tão simples assim ...
Vamos exibir os resultados:
Como esperado, os resultados são os mesmos, mas se você prestar muita atenção, perceberá que demorou muito mais tempo para exibir os
$Linq
resultados do que os$PowerShell
resultados.Vamos medir especificamente isso apenas recuperando uma propriedade do objeto resultante:
Demorou cerca de um fator 90 a mais para recuperar uma propriedade do
$Linq
objeto que o$PowerShell
objeto e esse era apenas um único objeto!Observe também uma outra armadilha: se você fizer isso de novo, algumas etapas podem parecer muito mais rápidas do que antes, isso ocorre porque algumas das expressões foram armazenadas em cache.
Resumindo, se você deseja comparar o desempenho entre duas funções, será necessário implementá-las no seu caso usado, comece com uma nova sessão do PowerShell e baseie sua conclusão no desempenho real da solução completa.
(1) Para obter mais informações e exemplos sobre o PowerShell e o LINQ, recomendo este site: PowerShell de alto desempenho com o LINQ
(2) Acho que há uma pequena diferença entre os dois conceitos, pois na avaliação lenta, o resultado é calculado quando necessário , ao contrário de execução adiada onde o resultado é calculado quando o sistema está ocioso
fonte