Existe-t-il un moyen intégré de mesurer le temps d'exécution d'une commande sur la ligne de commande Windows ?
C'est la meilleure solution pour les utilisateurs de Windows 7, car timeit.exe ne semble pas être compatible avec Windows 7.
Existe-t-il un moyen intégré de mesurer le temps d'exécution d'une commande sur la ligne de commande Windows ?
PowerShell a un cmdlet pour cela appelé Measure-Command
. Vous devrez vous assurer que PowerShell est disponible sur la machine qui l'exécute.
PS> Measure-Command { echo hi }
Days : 0
Hours : 0
Minutes : 0
Seconds : 0
Milliseconds : 0
Ticks : 1318
TotalDays : 1.52546296296296E-09
TotalHours : 3.66111111111111E-08
TotalMinutes : 2.19666666666667E-06
TotalSeconds : 0.0001318
TotalMilliseconds : 0.1318
Measure-Command
capture la sortie de la commande. Vous pouvez rediriger la sortie vers votre console en utilisant Out-Default
:
PS> Measure-Command { echo hi | Out-Default }
hi
Days : 0
...
Measure-Command
renvoie un TimeSpan
de sorte que le temps mesuré est imprimé sous la forme d'un ensemble de champs. Vous pouvez formater l'objet en une chaîne d'horodatage à l'aide de la fonction ToString()
:
PS> (Measure-Command { echo hi | Out-Default }).ToString()
hi
00:00:00.0001318
Si la commande dans Measure-Command
change la couleur du texte de votre console, utilisez [Console]::ResetColor()
pour le remettre à la normale.
C'est la meilleure solution pour les utilisateurs de Windows 7, car timeit.exe ne semble pas être compatible avec Windows 7.
Si vous voulez utiliser les commandes internes de Dos (par exemple : dir, echo, del, etc.), n'oubliez pas d'insérer "cmd /c" : Measure-Command { cmd /c dir /s c : \windows > nul }
Comment l'exécuter à partir d'une application externe qui peut exécuter des commandes shell ?
Si vous voulez
Essayez de copier le script suivant dans un nouveau fichier batch (par ex. timecmd.bat ) :
@echo off
@setlocal
set start=%time%
:: Runs your command
cmd /c %*
set end=%time%
set options="tokens=1-4 delims=:.,"
for /f %options% %%a in ("%start%") do set start_h=%%a&set /a start_m=100%%b %% 100&set /a start_s=100%%c %% 100&set /a start_ms=100%%d %% 100
for /f %options% %%a in ("%end%") do set end_h=%%a&set /a end_m=100%%b %% 100&set /a end_s=100%%c %% 100&set /a end_ms=100%%d %% 100
set /a hours=%end_h%-%start_h%
set /a mins=%end_m%-%start_m%
set /a secs=%end_s%-%start_s%
set /a ms=%end_ms%-%start_ms%
if %ms% lss 0 set /a secs = %secs% - 1 & set /a ms = 100%ms%
if %secs% lss 0 set /a mins = %mins% - 1 & set /a secs = 60%secs%
if %mins% lss 0 set /a hours = %hours% - 1 & set /a mins = 60%mins%
if %hours% lss 0 set /a hours = 24%hours%
if 1%ms% lss 100 set ms=0%ms%
:: Mission accomplished
set /a totalsecs = %hours%*3600 + %mins%*60 + %secs%
echo command took %hours%:%mins%:%secs%.%ms% (%totalsecs%.%ms%s total)
Utilisation
Si vous placez timecmd.bat dans un répertoire de votre chemin, vous pouvez l'appeler de n'importe où comme ceci :
timecmd [your command]
Par exemple
C:\>timecmd pause
Press any key to continue . . .
command took 0:0:1.18
Si vous voulez faire une redirection de sortie, vous pouvez citer la commande comme ceci :
timecmd "dir c:\windows /s > nul"
Cela devrait permettre de gérer les commandes qui s'exécutent de avant à après minuit, mais la sortie sera erronée si votre commande s'exécute pendant 24 heures ou plus.
remplacement de cmd /c %* avec %* fonctionne sauf si votre commande est un autre fichier batch. Dans ce cas, vous devez faire timecmd call other.bat
@JesseChisholm Dans Windows 8 (et j'ai lu que dans Windows 7 aussi) vous n'avez pas besoin de l'appel pour .bat.
Pour une raison quelconque, cela ne me donne que des résultats en secondes entières... ce qui est inutile pour moi. Je veux dire que je lance timecmd pause
et il en résulte toujours 1.00 sec, 2.00 sec, 4.00 sec... même 0.00 sec ! Windows 7.
Hehe, la solution la plus simple pourrait être celle-ci :
echo %time%
YourApp.exe
echo %time%
Cela fonctionne sur tous les Windows.
Dans le cas d'une application utilisant la sortie console, il peut être pratique de stocker l'heure de début dans une variable temporaire :
set startTime=%time%
YourApp.exe
echo Start Time: %startTime%
echo Finish Time: %time%
Tu es fou ? ! Ça implique de faire des maths, genre, dans ton cerveau. C'est pour ça qu'on a inventé les ordinateurs, pour éviter de faire des trucs comme ça.
C'est encore mieux (si votre application envoie des données à la console) : set startTime=%time% \n YourApp.exe \n echo Start Time: %startTime% \n echo Finish Time: %time%
(Désolé, je n'ai pas réussi à mettre de nouvelles lignes dans le commentaire)
Juste une petite extension de la réponse de Casey.K sur l'utilisation du Measure-Command
de PowerShell :
Vous pouvez invoquer PowerShell à partir de l'invite de commande standard, comme ceci :
powershell -Command "Measure-Command {echo hi}"
Cela va manger la sortie standard, mais vous pouvez empêcher cela en ajoutant | Out-Default
comme ceci depuis PowerShell :
Measure-Command {echo hi | Out-Default}
Ou à partir d'une invite de commande :
powershell -Command "Measure-Command {echo hi | Out-Default}"
Bien sûr, vous êtes libre d'envelopper cela dans un fichier script. *.ps1
ou *.bat
.
Si vous utilisez Windows 2003 (notez que Windows Server 2008 et les versions ultérieures ne sont pas prises en charge), vous pouvez utiliser le kit de ressources Windows Server 2003, qui contient timeit.exe, lequel affiche des statistiques d'exécution détaillées. Voici un exemple, en choisissant la commande "timeit - ?":
C:\>timeit timeit -?
Invalid switch -?
Usage: TIMEIT [-f filename] [-a] [-c] [-i] [-d] [-s] [-t] [-k keyname | -r keyname] [-m mask] [commandline...]
where: -f specifies the name of the database file where TIMEIT
keeps a history of previous timings. Default is .\timeit.dat
-k specifies the keyname to use for this timing run
-r specifies the keyname to remove from the database. If
keyname is followed by a comma and a number then it will
remove the slowest (positive number) or fastest (negative)
times for that keyname.
-a specifies that timeit should display average of all timings
for the specified key.
-i specifies to ignore non-zero return codes from program
-d specifies to show detail for average
-s specifies to suppress system wide counters
-t specifies to tabular output
-c specifies to force a resort of the data base
-m specifies the processor affinity mask
Version Number: Windows NT 5.2 (Build 3790)
Exit Time: 7:38 am, Wednesday, April 15 2009
Elapsed Time: 0:00:00.000
Process Time: 0:00:00.015
System Calls: 731
Context Switches: 299
Page Faults: 515
Bytes Read: 0
Bytes Written: 0
Bytes Other: 298
Vous pouvez obtenir TimeIt dans le kit de ressources Windows 2003. Il n'est pas disponible en téléchargement direct à partir du centre de téléchargement de Microsoft, mais on peut toujours l'obtenir à partir de l'adresse suivante arhive.org - Outils du kit de ressources Windows Server 2003 .
Y a-t-il un moyen de mesurer également le temps du noyau et/ou le temps utilisé par les sous-processus engendrés ?
FYI - Je ne pense pas que timeit fonctionne sur Windows 7 64-bit. Vous obtenez l'erreur "Unable to query system performance data (c0000004)". Utilisez plutôt la commande "Measure-Command" de PowerShell comme le suggère Casey.K : stackoverflow.com/questions/673523/
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
stackoverflow.com/questions/15831197/