¿Hay una manera simple de cronometrar la ejecución de un comando en PowerShell, como el comando 'time' en Linux?
Se me ocurrió esto:
$s=Get-Date; .\do_something.ps1 ; $e=Get-Date; ($e - $s).TotalSeconds
Pero me gustaría algo más simple como
time .\do_something.ps1
powershell
time
performance-testing
Paolo Tedesco
fuente
fuente
time { ping -n 1 google.com } -Samples 10
ejecutará los10
tiempos de comando y devolverá el tiempo promedio, mínimo y máximo empleado. Puede agregar-Silent
para tragar STDOUT.$t = Measure-Command {<<your command or code block>>}
. Probarlo y luego escriba$t
en el indicador para ver los resultados y todas las propiedades que tiene acceso, como$t.Milliseconds
,$t.TotalSeconds
, etc. Entonces podemos escribir a cualquier salida que queremos, por ejemplo,Write-Host That command took $t.TotalSeconds to complete.
También puede obtener el último comando del historial y restarlo
EndExecutionTime
de élStartExecutionTime
.fuente
Get-History | Group {$_.StartExecutionTime.Hour} | sort Count -desc
para ver su patrón de uso de PowerShell por hora del día. :-)$command = Get-History -Count 1 ; "{0}" -f ($command.EndExecutionTime - $command.StartExecutionTime)
Utilizar
Measure-Command
Ejemplo
La canalización a le
Out-Host
permite ver la salida del comando, que de otro modo es consumido porMeasure-Command
.fuente
Measure-Command {<your command } | Out-Host
- el Out-Host está fuera del bloque de scriptSimples
entonces puede usar como
Es posible que desee ajustar la salida
fuente
Measure-Command
oculta la salida del comando, por lo que esta solución a veces es mejor.Aquí hay una función que escribí que funciona de manera similar al
time
comando Unix :Fuente: https://gist.github.com/bender-the-greatest/741f696d965ed9728dc6287bdd336874
fuente
Measure-Command
o una de las otras formas en que puede cronometrar la ejecución en Powershell. Si lees la pregunta original, él pidió algo que funcione "como eltime
comando en Linux".Usando el cronómetro y formateando el tiempo transcurrido:
Muestras de uso
fuente
Solo una palabra sobre cómo sacar conclusiones (incorrectas) de cualquiera de los comandos de medición de rendimiento mencionados en las respuestas. Hay una serie de dificultades que deben tenerse en cuenta además de mirar el tiempo de invocación de una función o comando (personalizado).
Sjoemelsoftware
Personalmente, creo que " Sjoemelsoftware " no siempre se crea deliberadamente para engañar a los resultados de las pruebas, pero podría originarse en una situación práctica que sea similar a los casos de prueba como se muestra a continuación.
Como ejemplo, el uso de los comandos de medición de rendimiento enumerados, Language Integrated Query (LINQ) (1) , a menudo se califica como la forma más rápida de hacer algo y, a menudo, ¡pero ciertamente no siempre! Cualquiera que mida un aumento de velocidad de un factor 40 o más en comparación con los comandos nativos de PowerShell, probablemente esté midiendo o sacando una conclusión incorrecta.
El punto es que algunas clases .Net (como LINQ) usan una evaluación diferida (también conocida como ejecución diferida (2) ). Lo que significa que cuando se asigna una expresión a una variable, parece que se hace casi de inmediato, ¡pero de hecho todavía no procesó nada!
Supongamos que su fuente de puntos
. .\Dosomething.ps1
tiene su comando que tiene una expresión de PowerShell o una expresión de Linq más sofisticada (para facilitar la explicación, he incrustado directamente las expresiones directamente enMeasure-Command
):El resultado parece obvio, el último comando de Linq es aproximadamente 40 veces más rápido que el primer comando de PowerShell . Desafortunadamente, no es tan simple ...
Vamos a mostrar los resultados:
Como era de esperar, los resultados son los mismos, pero si ha prestado mucha atención, habrá notado que tomó mucho más tiempo mostrar los
$Linq
resultados que los$PowerShell
resultados.Midamos específicamente eso solo recuperando una propiedad del objeto resultante:
¡Le tomó alrededor de un factor 90 más tiempo recuperar una propiedad del
$Linq
objeto que el$PowerShell
objeto y eso fue solo un objeto!Observe también otro error: si lo vuelve a hacer, ciertos pasos pueden aparecer mucho más rápido que antes, esto se debe a que algunas de las expresiones se han almacenado en caché.
En pocas palabras, si desea comparar el rendimiento entre dos funciones, deberá implementarlas en su caso usado, comenzar con una nueva sesión de PowerShell y basar su conclusión en el rendimiento real de la solución completa.
(1) Para obtener más antecedentes y ejemplos sobre PowerShell y LINQ, le recomiendo este sitio: PowerShell de alto rendimiento con LINQ
(2) Creo que hay una pequeña diferencia entre los dos conceptos, ya que con la evaluación diferida el resultado se calcula cuando es necesario según lo previsto ejecución diferida donde el resultado se calcula cuando el sistema está inactivo
fuente