当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《如何在Windows命令行上测量命令的执行时间?》经验,为你挑选了13个好方法。

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



1> 小智..:

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

示例输入:

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


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

2> Luke Sampson..:

如果你想

    以(hh:mm:ss.ff格式)测量执行时间到百分之一秒

    无需下载和安装资源包

    看起来像一个巨大的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)

用法

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

timecmd [your command]

例如

C:\>timecmd pause
Press any key to continue . . .
command took 0:0:1.18

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

timecmd "dir c:\windows /s > nul"

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


将**cmd/c%***替换为**%***,除非您的命令是另一个批处理文件.然后你必须做**timecmd调用other.bat**
@CamiloMartin和其他人(像我一样) - 你可能有一个语言环境,它使用COMMA而不是DOT作为小数.因此,在这个scrpit中,将`delims =:.`更改为`delims =:.,`,然后它应该"全面"工作.
在该脚本中存在严重的算术错误:尝试使用:`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秒)`
出于某种原因,这只能让我在几秒钟内输出......这对我来说毫无用处.我的意思是我运行`timecmd pause`,它总是产生1.00秒,2.00秒,4.00秒......甚至0.00秒!Windows 7的.
@JesseChisholm在Windows 8中(我也在Windows 7中阅读过)你不需要调用.bat

3> LietKynes..:

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

echo %time%
YourApp.exe
echo %time%

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


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

set startTime=%time%
YourApp.exe
echo Start Time: %startTime%
echo Finish Time: %time%


你疯了吗?!这涉及在你的大脑中进行数学运算.这就是我们发明计算机的原因,所以我们可以避免做那样的事情.
更好(如果你的应用程序吐出输出到控制台):`set startTime =%time%\n YourApp.exe \n echo开始时间:%startTime%\n echo完成时间:%time%`(对不起,不能在评论中获取新行)
工作,但不告诉你使用的CPU时间:)
不,这是一个糟糕的选择.这告诉您挂钟时间,而不是CPU时间.因此,即使您的命令行可能只需要100毫秒,如果有另一个应用程序占用CPU,您的应用程序可能需要几秒钟(关闭100倍或更多).事实上,如果你的机器正在颠簸,你甚至可以等一分钟让你的小100ms应用程序运行.跟踪CPU时间,而不是挂钟时间!

4> 小智..:

如果您使用的是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

您可以在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
此工具包存在Windows 2008 64位的问题,但在2008 R2上无效
在Windows 7中,我看到"'timeit'未被识别为内部或外部命令,可操作程序或批处理文件."
我在Windows 10中看不到该命令,也无法轻松找到Win 10的资源工具包。有人知道如何在10中获得此工具吗?

5> 小智..:

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

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

    powershell -Command "Measure-Command {echo hi}"
    

    这将使用标准输出,但您可以通过| Out-Default从PowerShell 添加这样来阻止它:

    Measure-Command {echo hi | Out-Default}
    

    或者从命令提示符:

    powershell -Command "Measure-Command {echo hi | Out-Default}"
    

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



6> Nathan Herri..:

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

cmd /v:on /c "echo !TIME! & *mycommand* & echo !TIME!"

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


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

7> Treb..:

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

prompt $d $t $_$P$G

它给你的东西:

23.03.2009 15:45:50,77

C:\>

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

(空行)

myCommand.exe

(下一个空行)

myCommand2.exe

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

MyBatchFile.bat > output.txt


以为我会在讨论后几年落后,感谢您分享提示命令.我已经看过很多CMD技巧(更像是一个bash家伙),但这个让我不知所措.

8> Abe Voelker..:

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

abe@abe-PC:~$ time sleep 5

real    0m5.012s
user    0m0.000s
sys 0m0.000s

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


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

9> JohnW..:

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

@echo off
time < nul
yourexecutable.exe > c:\temp\output.txt
time < nul
rem on newer windows system you can try time /T

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

The current time is: 10:31:57.92
Enter the new time:
The current time is: 10:32:05.94
Enter the new time:


您也可以使用`echo%time%`,它提供与`time 假设你不需要跨不同语言的可移植性,你也可以在"time
10> pepoluan..:

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

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

timer
yourapp.exe
timer /s

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

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


分辨率为0.1秒.


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

11> 小智..:

我正在使用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 

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 

===  cd ===
C:\

Execution time: 0.015 s



12> 小智..:

只要它持续时间不超过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.


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

13> Martin Moene..:

还有TimeMem(2012年3月):

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

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有