Existe-t-il un moyen simple de chronométrer l'exécution d'une commande dans PowerShell, comme la commande «time» sous Linux?
Je suis venu avec ceci:
$s=Get-Date; .\do_something.ps1 ; $e=Get-Date; ($e - $s).TotalSeconds
Mais je voudrais quelque chose de plus simple comme
time .\do_something.ps1
powershell
time
performance-testing
Paolo Tedesco
la source
la source
time { ping -n 1 google.com } -Samples 10
exécutera les10
temps de commande et renverra le temps moyen, minimum et maximum pris. Vous pouvez ajouter-Silent
à avaler STDOUT.$t = Measure-Command {<<your command or code block>>}
. Essayez et puis tapez$t
à l'invite pour voir vos résultats et toutes les propriétés que vous avez accès, comme$t.Milliseconds
,$t.TotalSeconds
, etc. Ensuite , nous pouvons écrire à ce que la sortie que nous voulons, par exemple,Write-Host That command took $t.TotalSeconds to complete.
Vous pouvez également obtenir la dernière commande de l'historique et soustraire son
EndExecutionTime
de sonStartExecutionTime
.la source
Get-History | Group {$_.StartExecutionTime.Hour} | sort Count -desc
pour voir votre modèle d'utilisation de PowerShell par heure de la journée. :-)$command = Get-History -Count 1 ; "{0}" -f ($command.EndExecutionTime - $command.StartExecutionTime)
Utilisation
Measure-Command
Exemple
Le canal vers
Out-Host
vous permet de voir la sortie de la commande, qui est par ailleurs consommée parMeasure-Command
.la source
Measure-Command {<your command } | Out-Host
- l'Out-Host est en dehors du bloc de scriptSimples
peut alors utiliser comme
Vous voudrez peut-être modifier la sortie
la source
Measure-Command
masque la sortie des commandes, donc cette solution est parfois meilleure.Voici une fonction que j'ai écrite qui fonctionne de manière similaire à la
time
commande Unix :Source: https://gist.github.com/bender-the-greatest/741f696d965ed9728dc6287bdd336874
la source
Measure-Command
ou l'une des autres façons de chronométrer l'exécution dans Powershell. Si vous lisez la question d'origine, il a demandé quelque chose qui fonctionne "comme latime
commande sous Linux".Utilisation du chronomètre et du formatage du temps écoulé:
Échantillons d'utilisation
la source
Juste un mot pour tirer des conclusions (incorrectes) à partir de l'une des commandes de mesure du rendement mentionnées dans les réponses. Il y a un certain nombre d'écueils qui devraient être pris en considération en plus de regarder le temps d'invocation nu d'une fonction ou d'une commande (personnalisée).
Sjoemelsoftware
Personnellement, je pense que " Sjoemelsoftware " n'est pas toujours délibérément créé pour tricher les résultats des tests mais pourrait provenir de situations pratiques accommodantes qui sont similaires aux cas de test comme indiqué ci-dessous.
A titre d'exemple, en utilisant les commandes de mesure du rendement dans la liste, Query Language intégrée (LINQ) (1) , est souvent qualifié de la façon jeûné pour faire quelque chose et il est souvent, mais certainement pas toujours! Quiconque mesure une augmentation de vitesse d'un facteur 40 ou plus par rapport aux commandes PowerShell natives, mesure probablement ou tire une conclusion incorrecte.
Le fait est que certaines classes .Net (comme LINQ) utilisant une évaluation paresseuse (également appelées exécution différée (2) ). Cela signifie que lorsque vous affectez une expression à une variable, cela semble presque immédiatement être fait, mais en fait, il n'a encore rien traité!
Supposons que vous dot-source votre
. .\Dosomething.ps1
commande qui a soit une expression PowerShell ou une expression Linq plus sophistiquée (pour la facilité d'explication, j'ai directement intégré les expressions directement dans leMeasure-Command
):Le résultat semble évident, la dernière commande Linq est environ 40 fois plus rapide que la première commande PowerShell . Malheureusement, ce n'est pas si simple ...
Voyons les résultats:
Comme prévu, les résultats sont les mêmes mais si vous avez fait très attention, vous aurez remarqué qu'il a fallu beaucoup plus de temps pour afficher les
$Linq
résultats que les$PowerShell
résultats.Mesurons spécifiquement cela en récupérant simplement une propriété de l'objet résultant:
Il a fallu environ un facteur 90 de plus pour récupérer une propriété de l'
$Linq
objet, puis le$PowerShell
objet et ce n'était qu'un seul objet!Notez également un autre écueil: si vous recommencez, certaines étapes peuvent apparaître beaucoup plus rapidement qu'avant, car certaines des expressions ont été mises en cache.
En résumé, si vous souhaitez comparer les performances entre deux fonctions, vous devrez les implémenter dans votre cas d'utilisation, commencer par une nouvelle session PowerShell et baser votre conclusion sur les performances réelles de la solution complète.
(1) Pour plus d'informations et d'exemples sur PowerShell et LINQ, je recommande ce site: PowerShell haute performance avec LINQ
(2) Je pense qu'il y a une différence mineure entre les deux concepts, car avec une évaluation paresseuse, le résultat est calculé au besoin en fonction de exécution différée où le résultat est calculé lorsque le système est inactif
la source