6

我为一些网络调试创建了一个小工程应用程序。它需要一个 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;
    }
4

1 回答 1

5

0 或 15.625(幻数?)

是的,使用DateTime.Now仅精确到 CPU 时间片的长度,15-20 毫秒,具体取决于您的硬件和操作系统版本。

用于 System.Diagnostics.Stopwatch更准确的计时。

于 2011-10-20T08:47:51.630 回答