如何在Windows命令行上测量命令的执行时间?

Kur*_*aze 463 windows time cmd batch-file windows-server-2003

是否有内置方法来测量Windows命令行上命令的执行时间?

小智 442

或者,Windows PowerShell具有类似于Bash的"time"命令的内置命令.它被称为"测量 - 命令".您必须确保在运行它的计算机上安装PowerShell.

示例输入:

Measure-Command {echo hi}
Run Code Online (Sandbox Code Playgroud)

示例输出:

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
Run Code Online (Sandbox Code Playgroud)

  • 这是Windows 7用户的最佳解决方案,因为timeit.exe似乎不支持Windows 7 (21认同)
  • 如果你想使用内部dos命令(例如:dir,echo,del等),不要忘记插入"cmd/c":Measure-Command {cmd/c dir/sc:\ windows> nul} (13认同)
  • 令人讨厌的是它隐藏了stdout. (11认同)
  • 这绝对不是一个工具*'类似于Bash的时间命令'*.很高兴知道...但是:它不执行***并返回到`<stdout>`***括在括号中的命令的结果! (11认同)
  • 如果您在当前目录中对`.exe`进行基准测试,请使用:`Measure-Command {.\ your.exe}`.除非明确告诉,否则PowerShell显然不会从`pwd`运行. (7认同)
  • 使用这个```powershell -Command Measure-Command {YOUR_COMMAND}```这不会隐藏`stdout`. (3认同)
  • 请注意,vladimir veljkovic的答案显示了如何保持标准输出. (2认同)
  • 雷皮克尔错误引用了弗拉基米尔.它应该是``Measure-Command {YOUR_COMMAND | 的Out-Default}`` (2认同)

Luk*_*son 271

如果你想

  1. 以(hh:mm:ss.ff格式)测量执行时间到百分之一秒
  2. 无需下载和安装资源包
  3. 看起来像一个巨大的DOS书呆子(谁没有)

尝试将以下脚本复制到新的批处理文件中(例如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)
Run Code Online (Sandbox Code Playgroud)

用法

如果将timecmd.bat放在路径中的目录中,可以从以下任何位置调用它:

timecmd [your command]
Run Code Online (Sandbox Code Playgroud)

例如

C:\>timecmd pause
Press any key to continue . . .
command took 0:0:1.18
Run Code Online (Sandbox Code Playgroud)

如果要进行输出重定向,可以像这样引用命令:

timecmd "dir c:\windows /s > nul"
Run Code Online (Sandbox Code Playgroud)

这应该处理从午前到午夜之间运行的命令,但如果命令运行24小时或更长时间,输出将是错误的.

  • 将**cmd/c%***替换为**%***,除非您的命令是另一个批处理文件.然后你必须做**timecmd调用other.bat** (9认同)
  • @CamiloMartin和其他人(像我一样) - 你可能有一个语言环境,它使用COMMA而不是DOT作为小数.因此,在这个scrpit中,将`delims =:.`更改为`delims =:.,`,然后它应该"全面"工作. (9认同)
  • 在该脚本中存在严重的算术错误:尝试使用:`set start = 10:10:10.10``set end = 10:11:10.09`并且它将输出:`command take 0:1:-1.99(59.99)总计)`你应该颠倒进行"lss 0"比较的4行的顺序,以便进位从低到高的六位数正确进行.然后输出变为:`命令取0:0:59.99(总共59.99秒)` (5认同)
  • 出于某种原因,这只能让我在几秒钟内输出......这对我来说毫无用处.我的意思是我运行`timecmd pause`,它总是产生1.00秒,2.00秒,4.00秒......甚至0.00秒!Windows 7的. (4认同)
  • 对于任何想知道的人:TomaszGandor 和 Jean-FrançoisLarvoire 的修复已被编辑到上面的脚本中。另外@Jashan:在你的毫秒填充中有一个错误的错误(它实际上是百分之一,你使用的是 `secs` 变量而不是 `ms`),​​所以它应该是:`set "ms=0%ms%"`和`设置“ms=%ms:~-2%”`。但除此之外,我喜欢这个! (3认同)
  • @JesseChisholm在Windows 8中(我也在Windows 7中阅读过)你不需要调用.bat (2认同)

Lie*_*nes 219

呵呵,最简单的解决方案可能就是:

echo %time%
YourApp.exe
echo %time%
Run Code Online (Sandbox Code Playgroud)

这适用于每个开箱即用的Windows.


如果应用程序使用控制台输出,则可以方便地将开始时间存储在临时变量中:

set startTime=%time%
YourApp.exe
echo Start Time: %startTime%
echo Finish Time: %time%
Run Code Online (Sandbox Code Playgroud)

  • 你疯了吗?!这涉及在你的大脑中进行数学运算.这就是我们发明计算机的原因,所以我们可以避免做那样的事情. (154认同)
  • 更好(如果你的应用程序吐出输出到控制台):`set startTime =%time%\n YourApp.exe \n echo开始时间:%startTime%\n echo完成时间:%time%`(对不起,不能在评论中获取新行) (10认同)
  • 工作,但不告诉你使用的CPU时间:) (5认同)
  • 杰出的!尽管如此,对于 CPU 时间,它并没有真正的帮助 (2认同)
  • 不,这是一个糟糕的选择.这告诉您挂钟时间,而不是CPU时间.因此,即使您的命令行可能只需要100毫秒,如果有另一个应用程序占用CPU,您的应用程序可能需要几秒钟(关闭100倍或更多).事实上,如果你的机器正在颠簸,你甚至可以等一分钟让你的小100ms应用程序运行.跟踪CPU时间,而不是挂钟时间! (2认同)
  • @MykhayloKopytonenko 是的,它可以:`echo %time% &amp;&amp; YourCmd --with -- -params &amp;&amp; echo %time%` (2认同)
  • 我知道我的答案不会计算执行时间。但请考虑到,当我在 2010 年 3 月写下答案时,最常见的 Windows 操作系统是 Windows XP/Server 2003,它默认没有安装 PowerShell。上述解决方案开箱即用,无需安装额外的软件(这在企业环境中特别有用)。 (2认同)

小智 109

如果您使用的是Windows 2003(请注意,不支持Windows Server 2008及更高版本),您可以使用Windows Server 2003资源工具包,其中包含显示详细执行统计信息的timeit.exe.这是一个例子,计时命令"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
Run Code Online (Sandbox Code Playgroud)

您可以在Windows 2003 Resource Kit中获取TimeIt.在这里下载 .

  • 仅供参考 - 我不认为timeit适用于Windows 7 64位.您收到错误"无法查询系统性能数据(c0000004).而是使用PowerShell的"Measure-Command",如Casey.K建议:http://stackoverflow.com/questions/673523/how-to-measure-execution-时间 - 命令在窗口的命令行/ 4801509#4801509 (38认同)
  • 此工具包存在Windows 2008 64位的问题,但在2008 R2上无效 (7认同)
  • 在Windows 7中,我看到"'timeit'未被识别为内部或外部命令,可操作程序或批处理文件." (4认同)
  • 我在Windows 10中看不到该命令,也无法轻松找到Win 10的资源工具包。有人知道如何在10中获得此工具吗? (2认同)

小智 88

只是一点点扩大,从Casey.K回答有关使用Measure-CommandPowerShell的:

  1. 您可以从标准命令提示符调用PowerShell,如下所示:

    powershell -Command "Measure-Command {echo hi}"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这将使用标准输出,但您可以通过| Out-Default从PowerShell 添加这样来阻止它:

    Measure-Command {echo hi | Out-Default}
    
    Run Code Online (Sandbox Code Playgroud)

    或者从命令提示符:

    powershell -Command "Measure-Command {echo hi | Out-Default}"
    
    Run Code Online (Sandbox Code Playgroud)

当然,你可以自由在脚本文件来包装这个*.ps1*.bat.

  • 如果我们要测量的命令有引号怎么办?在这种情况下可以将其转换为 .bat 脚本吗?例如`measureTime.bat "c:\program files\some dir\program.exe"` (2认同)

Nat*_*ing 51

我在Windows Server 2008 R2中使用的单行程序是:

cmd /v:on /c "echo !TIME! & *mycommand* & echo !TIME!"
Run Code Online (Sandbox Code Playgroud)

只要mycommand不需要引号(使用cmd的引用处理).的/v:on是,以允许与在命令的执行进行评估独立地,而不是一旦两个不同的时间值.

  • 更简单:`echo%time%&*mycommand*&call echo%^ time%`.另请参见[此答案](http://stackoverflow.com/a/42603985/778560). (7认同)
  • 如果你在第二个时间重复cmd/v:on,我们甚至可以让_mycommand_包含引号.示例:`cmd/v:on/c echo!TIME!&echo"Quoted mycommand"&cmd/v:on/c echo!TIME!`. (2认同)

Tre*_*reb 47

如果打开命令窗口并手动调用命令,则可以在每个提示上显示时间戳,例如

prompt $d $t $_$P$G
Run Code Online (Sandbox Code Playgroud)

它给你的东西:

23.03.2009 15:45:50,77

C:\>

如果您有一个执行命令的小批处理脚本,则在每个命令之前都有一个空行,例如

(空行)

myCommand.exe

(下一个空行)

myCommand2.exe

您可以通过提示中的时间信息计算每个命令的执行时间.最好的方法是将输出传递给文本文件以进行进一步分析:

MyBatchFile.bat > output.txt
Run Code Online (Sandbox Code Playgroud)

  • 以为我会在讨论后几年落后,感谢您分享提示命令.我已经看过很多CMD技巧(更像是一个bash家伙),但这个让我不知所措. (2认同)
  • 简单,优雅,无需安装,无需为一次性命令编写批处理文件,并且可以对批处理文件中的每一步进行计时。 (2认同)

Abe*_*ker 25

由于其他人建议安装免费软件和PowerShell之类的东西,你也可以安装Cygwin,它可以让你访问许多基本的Unix命令,比如时间:

abe@abe-PC:~$ time sleep 5

real    0m5.012s
user    0m0.000s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)

不确定Cygwin增加了多少开销.

  • 在回答Windows问题时,Cygwin被视为作弊:-) (37认同)
  • 他规定ResourceKit,TimeMem,ptime.exe,PowerShell和其他实用程序用户首先开始作弊.因此,作者在您撰写之前已对您的评论不合适. (13认同)

Joh*_*hnW 22

不像Unix上的某些功能那么优雅,但创建一个cmd文件,如下所示:

@echo off
time < nul
yourexecutable.exe > c:\temp\output.txt
time < nul
rem on newer windows system you can try time /T
Run Code Online (Sandbox Code Playgroud)

这将显示开始和停止时间,如下所示:

The current time is: 10:31:57.92
Enter the new time:
The current time is: 10:32:05.94
Enter the new time:
Run Code Online (Sandbox Code Playgroud)

  • `time /T` 只有在进程运行几分钟时才可用!`time &lt; nul` 更丑但更精确。 (3认同)
  • 您也可以使用`echo%time%`,它提供与`time <nul`相同的格式和精度,但是你可以避免`输入新时间:`输出... (3认同)
  • 假设你不需要跨不同语言的可移植性,你也可以在"time <nul"之后放置一个"current"或类似的东西(顺便说一下nul的好用;我总是使用echo.| time,但是看起来不那么优雅:)).并使用"for"仅提取时间,而不是文本. (2认同)
  • 如果启用了命令扩展(即默认设置),Win XP 版本的`time` 有一个`/t` 选项,它只显示当前系统时间,而不会提示您输入新时间。但是,当您这样做时,它只显示小时和分钟,这对于某些用途来说可能不够好。(请参阅 John Snow 对此问题的回答。) (2认同)

pep*_*uan 17

我使用名为"GS Timer"的免费软件.

只需制作一个这样的批处理文件:

timer
yourapp.exe
timer /s
Run Code Online (Sandbox Code Playgroud)

如果需要一组时间,只需将timer/s的输出传递到.txt文件中.

你可以在这里得到它:Gammadyne的免费DOS工具


分辨率为0.1秒.

  • 这是开发者自己页面的直接链接:http://www.gammadyne.com/cmdline.htm#timer (8认同)
  • 我不认为使用第三方应用程序可以被认为是"使用标准手段". (4认同)
  • 提问者的意思是"没有安装额外的软件",但最高(接受)的答案还需要安装一个完整的Windows 2003 Resource Kit!无论如何,timer.exe非常适合我正在寻找的东西,谢谢! (4认同)

小智 14

我正在使用Windows XP,由于某种原因,timeit.exe对我不起作用.我找到了另一种选择 - PTIME.这非常有效.

http://www.pc-tools.net/win32/ptime/

示例 -

C:\> ptime

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

Syntax: ptime command [arguments ...]

ptime will run the specified command and measure the execution time
(run time) in seconds, accurate to 5 millisecond or better. It is an
automatic process timer, or program timer.


C:\> ptime cd

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

===  cd ===
C:\

Execution time: 0.015 s
Run Code Online (Sandbox Code Playgroud)


小智 10

只要它持续时间不超过24小时......

@echo off

set starttime=%TIME%
set startcsec=%STARTTIME:~9,2%
set startsecs=%STARTTIME:~6,2%
set startmins=%STARTTIME:~3,2%
set starthour=%STARTTIME:~0,2%
set /a starttime=(%starthour%*60*60*100)+(%startmins%*60*100)+(%startsecs%*100)+(%startcsec%)

:TimeThis
ping localhost 

set endtime=%time%
set endcsec=%endTIME:~9,2%
set endsecs=%endTIME:~6,2%
set endmins=%endTIME:~3,2%
set endhour=%endTIME:~0,2%
if %endhour% LSS %starthour% set /a endhour+=24
set /a endtime=(%endhour%*60*60*100)+(%endmins%*60*100)+(%endsecs%*100)+(%endcsec%)

set /a timetaken= ( %endtime% - %starttime% )
set /a timetakens= %timetaken% / 100
set timetaken=%timetakens%.%timetaken:~-2%

echo.
echo Took: %timetaken% sec.
Run Code Online (Sandbox Code Playgroud)

  • 令人印象深刻,但我不认为如果在开始或结束时有一个08或09因为它们被解释为octals.我的回答处理:) (5认同)

Mar*_*ene 10

还有TimeMem(2012年3月):

这是一个Windows实用程序,它执行程序并显示其执行时间,内存使用情况和IO统计信息.它的功能类似于Unix时间实用程序.


Nad*_*adu 8

这里有一个

后缀定时器版本:

用法示例:

超时 1 | TimeIt.cmd

Execution took  ~969 milliseconds.
Run Code Online (Sandbox Code Playgroud)

将其复制并粘贴到一些编辑器中,例如Notepad++并将其另存为TimeIt.cmd

:: --- TimeIt.cmd ----
    @echo off
    setlocal enabledelayedexpansion

    call :ShowHelp

    :: Set pipeline initialization time
    set t1=%time%

    :: Wait for stdin
    more

    :: Set time at which stdin was ready
    set t2=!time!


    :: Calculate difference
    Call :GetMSeconds Tms1 t1
    Call :GetMSeconds Tms2 t2

    set /a deltaMSecs=%Tms2%-%Tms1%
    echo Execution took ~ %deltaMSecs% milliseconds.

    endlocal
goto :eof

:GetMSeconds
    Call :Parse        TimeAsArgs %2
    Call :CalcMSeconds %1 %TimeAsArgs%

goto :eof

:CalcMSeconds
    set /a %1= (%2 * 3600*1000) + (%3 * 60*1000) + (%4 * 1000) + (%5)
goto :eof

:Parse

    :: Mask time like " 0:23:29,12"
    set %1=!%2: 0=0!

    :: Replace time separators with " "
    set %1=!%1::= !
    set %1=!%1:.= !
    set %1=!%1:,= !

    :: Delete leading zero - so it'll not parsed as octal later
    set %1=!%1: 0= !
goto :eof

:ShowHelp
    echo %~n0 V1.0 [Dez 2015]
    echo.
    echo Usage: ^<Command^> ^| %~nx0
    echo.
    echo Wait for pipe getting ready... :)
    echo  (Press Ctrl+Z ^<Enter^> to Cancel)
goto :eof
Run Code Online (Sandbox Code Playgroud)

^ - 基于“丹尼尔斯帕克斯”版本


小智 7

根据您使用的 Windows 版本,只需运行即可bash让您进入 Bash 模式。这将允许您直接使用 PowerShell 上不可用的一堆命令(如time命令)。计时命令现在就像执行一样简单:

# The clause <your-command> (without the angle brackets) denotes the command you want to run.
$ time <your-command>
Run Code Online (Sandbox Code Playgroud)

注意:您可以通过exit在 Bash 模式下运行轻松退出 Bash 模式并返回到主流 shell 。

在尝试了Measure-Command有时会产生不需要的统计数据的其他方法(如)后,这对我来说非常有效(Windows 10)。希望这也适用于您。

  • 截至 Windows 10 1607 最佳答案。 (3认同)

Rai*_*ner 6

测量时间的替代方法就是“Get-Date”。您没有转发输出等麻烦。

$start = Get-Date
[System.Threading.Thread]::Sleep(1500)
$(Get-Date) - $start
Run Code Online (Sandbox Code Playgroud)

输出:

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 1
Milliseconds      : 506
Ticks             : 15060003
TotalDays         : 1.74305590277778E-05
TotalHours        : 0.000418333416666667
TotalMinutes      : 0.025100005
TotalSeconds      : 1.5060003
TotalMilliseconds : 1506.0003
Run Code Online (Sandbox Code Playgroud)


asc*_*pfl 5

这是一个避免延迟扩展的单行,这可能会干扰某些命令:

cmd /E /C "prompt $T$$ & echo.%TIME%$ & COMMAND_TO_MEASURE & for %Z in (.) do rem/ "
Run Code Online (Sandbox Code Playgroud)

输出类似于:

14:30:27.58$
...
14:32:43.17$ rem/ 
Run Code Online (Sandbox Code Playgroud)

对于长期测试,替换$Tby$D, $T%TIME%by%DATE%, %TIME%以包括日期。

要在批处理文件中使用它,请替换%Z%%Z.


更新

这是一个改进的单行(也没有延迟扩展):

cmd /E /C "prompt $D, $T$$ & (for %# in (.) do rem/ ) & COMMAND_TO_MEASURE & for %# in (.) do prompt"
Run Code Online (Sandbox Code Playgroud)

输出类似于以下内容:

2015/09/01, 14:30:27.58$ rem/ 
...
2015/09/01, 14:32:43.17$ prompt
Run Code Online (Sandbox Code Playgroud)

这种方法不包括cmd在结果中实例化新的过程,也不包括prompt命令。


Tho*_*son 5

如果安装了CMake,则只需运行以下命令即可。

cmake -E time <the_command_to_measure_run_time>
Run Code Online (Sandbox Code Playgroud)