【问题标题】:Why is TIMEOUT command on Windows not very accurate?为什么 Windows 上的 TIMEOUT 命令不是很准确?
【发布时间】:2015-12-27 12:36:40
【问题描述】:

我编写了以下程序只是为了测试 Windows 批处理文件命令 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

我在多次运行中得到以下输出: 开始时间:17:49:47.47 结束时间:17:49:57.17 开始时间:6418747 厘秒 结束时间: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 实际上并没有等待给定的时间,而是等待第二个倍数的滴答声,也就是说,第一个滴答声可能立即发生或最多持续一秒钟,例如@987654324 @ 等待时间 > 2 秒且 ping 127.0.0.1 -n 4(4 次尝试,每次间隔为 1 秒)...
  • 感谢您的回复.....
  • if %DURATION% LSS 0 set /A "DURATION+=8640000"(以厘秒为单位加上 24 小时)测量几天之间的时间...

标签: windows batch-file time


【解决方案1】:

timeout 实际上并没有等待给定的时间,而是等待第二个滴答声(或第二个倍数),也就是说,第一个滴答声可以在命令运行时立即发生,也可以最多持续一秒钟,取决于命令启动的时间点。

因此,例如,timeout /T 3 等待的时间大于 2 秒且最多 3 秒,因为第一个滴答发生在命令运行后 > 0 秒和

要准确等待 3 秒,请使用 ping 127.0.0.1 -n 4(4 次 ping 尝试,每次 3 次间隔为 1 秒)。

注意:
要更精确地测量命令的执行时间,您可能对this method 感兴趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-11
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 2010-12-03
    • 2023-03-18
    相关资源
    最近更新 更多