我为一些网络调试创建了一个小工程应用程序。它需要一个 IP 地址列表并 ping 它们,用户设置超时和速率。它记录平均往返时间,每次发送失败时,它都会记录失败的持续时间和发生时间的时间戳......
这就是想法。我在带有 .Net4 的 Win7 机器上开发了它,并且不得不将它放在一组 XP 笔记本电脑上。
问题是测试期间我的盒子上的持续时间值显示不错的毫秒持续时间,在 XP 盒子上,当我看到它们显示 0 或 15.625(幻数?)......并且在字符串中有有趣的方形盒子符号?
public void LinkUp()
{
if (_isLinkUp) return;
_upTime = DateTime.Now;
var span = _upTime.Subtract(_downTime);
_downTimeLog.Add(new LinkDown()
{
_span = span,
_status = _ipStatus,
_time = _downTime
});
_isLinkUp = true;
}
这就是记录日志的部分。_ipStatus 是 ping 失败的原因(通常是超时)。
_downEventLog.AppendLine(" Duration-> " + linkDownLogEvent._span.TotalMilliseconds + "ms\n");
这就是打印的部分......任何人都可以阐明这种明显的差异吗?
该问题已得到解答,但我将在此处进行编辑以获取更多信息。
编辑:
似乎差异不在于 Win7 和 WinXP 的差异,而是在于 32 位和 64 位。
正如Henk所指出的,在 32 位 Windows 系统中,系统时钟的粒度为 15-16 毫秒,这就是时间跨度小于 16 毫秒的每个值给我的值 15.625。
在 64 位系统中,系统调用是对具有更精细粒度的不同方法集的调用。因此,在我的 x64 开发机器上,我的系统时钟具有毫秒精度!
现在,秒表通过处理器仪器使用硬件接口来记录更精细的粒度(可能不是每个处理器滴答声,但我想像这种想法的东西非常准确)。如果操作系统底层的硬件没有这种级别的检测,它将使用系统时间。所以要小心!但我猜大多数现代台式机/笔记本电脑都有这种仪器......嵌入式设备或那种性质的东西可能没有,但是据我所知,秒表类不在 Compact Framework 中(在这里你必须使用 QueryPerformanceCounter( ))。
希望这一切都有帮助。它对我帮助很大。
_spanStopWatch 初始化程序周围的某个地方:
if (!_spanStopWatch.IsHighResolution)
{
throw new ThisMachineIsNotAccurateEnoughForMyLikingException("Find a better machine.");
}
螺母和螺栓:
public void LinkUp()
{
if (_isLinkUp) return;
_spanStopWatch.Stop();
var span = _spanStopWatch.Elapsed;
_downTimeLog.Add(new LinkDown()
{
_span = span,
_status = _ipStatus,
_time = _downTime
});
_isLinkUp = true;
}