655 votes

Comment mesurer le temps d'exécution d'une commande sur la ligne de commande Windows ?

Existe-t-il un moyen intégré de mesurer le temps d'exécution d'une commande sur la ligne de commande Windows ?

0 votes

661voto

Casey.K Points 1541

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.

23 votes

C'est la meilleure solution pour les utilisateurs de Windows 7, car timeit.exe ne semble pas être compatible avec Windows 7.

16 votes

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 }

0 votes

Comment l'exécuter à partir d'une application externe qui peut exécuter des commandes shell ?

383voto

Luke Sampson Points 3359

Si vous voulez

  1. Pour mesurer le temps d'exécution jusqu'au centième de seconde en (format hh:mm:ss.ff)
  2. Ne pas avoir à télécharger et à installer un pack de ressources
  3. Pour avoir l'air d'un énorme nerd DOS (qui ne l'est pas)

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.

11 votes

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

2 votes

@JesseChisholm Dans Windows 8 (et j'ai lu que dans Windows 7 aussi) vous n'avez pas besoin de l'appel pour .bat.

4 votes

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.

280voto

TechGibbon Points 1009

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%

177 votes

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.

2 votes

brillant ! Même si, pour le temps du CPU, cela n'aide pas vraiment

13 votes

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)

128voto

Vladimir Veljkovic Points 1277

Juste une petite extension de la réponse de Casey.K sur l'utilisation du Measure-Command de PowerShell :

  1. Vous pouvez invoquer PowerShell à partir de l'invite de commande standard, comme ceci :

    powershell -Command "Measure-Command {echo hi}"
  2. 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 .

2 votes

Que se passe-t-il si la commande que nous voulons mesurer comporte des guillemets ? Peut-on la transformer en un .bat script dans ce cas ? Par exemple measureTime.bat "c:\program files\some dir\program.exe"

123voto

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 .

8 votes

Ce kit a des problèmes avec Windows 2008 64bit et ne fonctionne pas sur 2008 R2.

0 votes

Y a-t-il un moyen de mesurer également le temps du noyau et/ou le temps utilisé par les sous-processus engendrés ?

43 votes

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.com

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.

Powered by:

X