为什么Windows上的TIMEOUT命令不是很准确?

我编写了下面的程序来testingWindowsbatch file命令TIMEOUT,PAUSE和SLEEP的准确性:

@echo off setlocal rem The format of %TIME% is HH:MM:SS,CS for example 23:59:59,99 set STARTTIME=%TIME% TIMEOUT 10 set ENDTIME=%TIME% rem output as time echo STARTTIME: %STARTTIME% echo ENDTIME: %ENDTIME% rem convert STARTTIME and ENDTIME to centiseconds set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%-100)*6000 + (1%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100) set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000 + (1%ENDTIME:~6,2%-100)*100 + (1%ENDTIME:~9,2%-100) rem calculating the duratyion is easy set /A DURATION=%ENDTIME%-%STARTTIME% rem we might have measured the time in between days if %ENDTIME% LSS %STARTTIME% set set /A DURATION=%STARTTIME%-%ENDTIME% rem now break the centiseconds down to hors, minutes, seconds and the remaining centiseconds set /A DURATIONH=%DURATION% / 360000 set /A DURATIONM=(%DURATION% - %DURATIONH%*360000) / 6000 set /A DURATIONS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000) / 100 set /A DURATIONHS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000 - %DURATIONS%*100) rem some formatting if %DURATIONH% LSS 10 set DURATIONH=0%DURATIONH% if %DURATIONM% LSS 10 set DURATIONM=0%DURATIONM% if %DURATIONS% LSS 10 set DURATIONS=0%DURATIONS% if %DURATIONHS% LSS 10 set DURATIONHS=0%DURATIONHS% rem outputing echo STARTTIME: %STARTTIME% centiseconds echo ENDTIME: %ENDTIME% centiseconds echo DURATION: %DURATION% in centiseconds echo %DURATIONH%:%DURATIONM%:%DURATIONS%,%DURATIONHS% endlocal goto :EOF 

我有多次运行的输出:STARTTIME:17:49:47.47 ENDTIME:17:49:57.17 STARTTIME:6418747厘秒ENDTIME:6419717厘秒持续时间:970厘秒00:00:09,70

 STARTTIME: 17:52:00.84 ENDTIME: 17:52:10.15 STARTTIME: 6432084 centiseconds ENDTIME: 6433015 centiseconds DURATION: 931 in centiseconds 00:00:09,31 STARTTIME: 17:53:02.36 ENDTIME: 17:53:12.14 STARTTIME: 6438236 centiseconds ENDTIME: 6439214 centiseconds DURATION: 978 in centiseconds 00:00:09,78 STARTTIME: 17:55:22.14 ENDTIME: 17:55:32.16 STARTTIME: 6452214 centiseconds ENDTIME: 6453216 centiseconds DURATION: 1002 in centiseconds 00:00:10,02 STARTTIME: 17:55:38.49 ENDTIME: 17:55:48.11 STARTTIME: 6453849 centiseconds ENDTIME: 6454811 centiseconds DURATION: 962 in centiseconds 00:00:09,62 

任何一个解释输出可以非常的不同,为什么持续时间不接近10? 错误是大约4%。

timeout实际上并不等待给定的时间量,而是等待第二个时间单位(或第二个倍数),也就是说,第一个时间间隔可以在命令运行时立即发生,或者最多可以持续一秒,具体取决于点该命令启动的时间。

因此,例如, timeout /T 3最多等待2秒钟和3秒钟的时间,因为在命令运行之后,第一个tick发生> 0s,<= 1s,剩下的2个ticks发生在另一个完整秒之后。

要等待3秒钟,请使用ping 127.0.0.1 -n 4 (4次ping,每次间隔3次)。

注意:
要更准确地测量命令的执行时间,您可能对此方法感兴趣。