标题: [系统相关] [分享]发现一个系统内置的较精确的延时命令pathping [打印本页]
作者: caruko 时间: 2011-1-3 00:37 标题: [分享]发现一个系统内置的较精确的延时命令pathping
pathping [-n] [-h MaximumHops] [-g HostList] [-p Period] [-q NumQueries [-w Timeout] [-i IPAddress] [-4 IPv4] [-6 IPv6][TargetName]
参数
-n 阻止 pathping 试图将中间路由器的 IP 地址解析为各自的名称。这有可能加快 pathping 的结果显示。
-h MaximumHops 指定搜索目标(目的)的路径中存在的跃点的最大数。默认值为 30 个跃点。
-g HostList 指定回响请求消息利用 HostList 中指定的中间目标集在 IP 数据头中使用“稀疏来源路由”选项。使用稀疏来源路由时,相邻的中间目标可以由一个或多个路由器分隔开。HostList 中的地址或名称的最大数为 9。HostList 是一系列由空格分隔的 IP 地址(用带点的十进制符号表示)。
-p Period 指定两个连续的 ping 之间的时间间隔(以毫秒为单位)。默认值为 250 毫秒(1/4 秒)。
-q NumQueries 指定发送到路径中每个路由器的回响请求消息数。默认值为 100 个查询。
-w Timeout 指定等待每个应答的时间(以毫秒为单位)。默认值为 3000 毫秒(3 秒)。
-i IPAddress 指定源地址。 -4 IPv4 指定 pathping 只使用 IPv4。
-6 IPv6 指定 pathping 只使用 IPv6。
TargetName 指定目的端,它既可以是 IP 地址,也可以是主机名。
通过上面命令说明,那么构造如下命令- pathping -n -h 1 -q 1 -p 300 127.0.0.1 >nul
复制代码
-n 阻止解析,加快显示。
-h 1 因为是ping自己,所以跃点数1。
-q 1 就是只发送一个数据包
-p 300 即延迟300毫秒
当-p 值为1毫秒时,我这里运行耗费时间大约是60-100ms之间,并且大部分时间为80-90ms。
-p 值较大时,运行的时间仍然大约是 p值+60-100ms。
所以这个命令的精确度大约是50ms左右,并且最低计时时间可以看成是100ms。
[ 本帖最后由 caruko 于 2011-1-3 00:42 编辑 ]
作者: wc726842270 时间: 2011-1-3 00:44
LZ的这个却实是没见过.只能说对P还不了解.以下是小弟学习中查到的,分享一下- @echo off
- set /p delay=请输入需延迟的毫秒数:
- set TotalTime=0
- set NowTime=%time%
- ::读取起始时间,时间格式为:13:01:05.95
- echo 程序开始时间:%NowTime%
- :delay_continue
- set /a minute1=1%NowTime:~3,2%-100
- ::读取起始时间的分钟数
- set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
- ::将起始时间的秒数转为毫秒
- set NowTime=%time%
- set /a minute2=1%NowTime:~3,2%-100
- :: 读取现在时间的分钟数
- set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
- ::将现在时间的秒数转为毫秒
- set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
- if %TotalTime% lss %delay% goto delay_continue
- echo 程序结束时间:%time%
- echo 设定延迟时间:%delay%毫秒
- echo 实际延迟时间:%TotalTime%毫秒
- pause
复制代码
实现原理:首先设定要延迟的毫秒数,然后用循环累加时间,直到累加时间大于等于延迟时间。
误差:windows系统时间只能精确到10毫秒,所以理论上有可能存在10毫秒误差。
经测试,当延迟时间大于500毫秒时,上面的延迟程序一般不存在误差。当延迟时间小于500毫秒时,可能有几十毫秒误差,为什么?因为延迟程序本身也是有运行时间的,同时系统时间只能精确到10毫秒
作者: caruko 时间: 2011-1-3 00:51
- @echo off
- setlocal enabledelayedexpansion
- for /l %%a in (1 1 20) do (
- set time1=!time!
- pathping -n -h 1 -q 1 -p 15 127.0.0.1 >nul
- echo !time1!---^>!time!
- )
复制代码
下面是运行结果:
0:45:33.29---> 0:45:33.37
0:45:33.37---> 0:45:33.46
0:45:33.46---> 0:45:33.56
0:45:33.56---> 0:45:33.64
0:45:33.64---> 0:45:33.73
0:45:33.73---> 0:45:33.81
0:45:33.81---> 0:45:33.90
0:45:33.90---> 0:45:33.98
0:45:33.98---> 0:45:34.07
0:45:34.07---> 0:45:34.15
0:45:34.15---> 0:45:34.25
0:45:34.25---> 0:45:34.32
0:45:34.32---> 0:45:34.42
0:45:34.42---> 0:45:34.50
0:45:34.50---> 0:45:34.59
0:45:34.59---> 0:45:34.68
0:45:34.68---> 0:45:34.76
0:45:34.76---> 0:45:34.85
0:45:34.85---> 0:45:34.93
0:45:34.93---> 0:45:35.03
作者: caruko 时间: 2011-1-3 00:55
原帖由 wc726842270 于 2011-1-3 00:44 发表
LZ的这个却实是没见过.只能说对P还不了解.以下是小弟学习中查到的,分享一下@echo off
set /p delay=请输入需延迟的毫秒数:
set TotalTime=0
set NowTime=%time%
::读取起始时间,时间格式为:13:01:05.95
echo ...
你这个需要大量的CPU占用...
而不是能将进程阻塞,CPU闲置等待结果的好方式。
这也是为什么很多人用ping -n 1 127.1>nul 来延时的原因。
而如果使用choice跟MSG延时,只能精确到秒。
[ 本帖最后由 caruko 于 2011-1-3 00:58 编辑 ]
作者: wc726842270 时间: 2011-1-3 01:07 标题: 回复 4楼 的帖子
呵呵,这个倒没想过,因为在网吧.说实话也不懂.本人一直以来都用CHOICE和ping来延时的.2L仅是一个思路,至于延时么,我都不用(关键太长,写起来很麻烦)
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |