32位和64位Windows之间的日期时间粒度

tig*_*ars 6 c# datetime timespan x86-64 stopwatch

我已经为一些网络调试创建了一个小工程应用程序.它需要一个IP地址列表并对其进行ping操作,并设置用户设置的超时和速率.它记录了平均往返时间,每当其中一个发送失败时,它会记录它的失败持续时间和发生时间的时间戳...

这就是主意.我是在带有.Net4的Win7机器上开发的,并且不得不把它放在一套XP笔记本电脑上.

问题是测试期间我的盒子上的持续时间值显示了漂亮的ms持续时间,在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;
    }
Run Code Online (Sandbox Code Playgroud)

这就是日志的作用._ipStatus是ping失败原因(通常是超时).

    _downEventLog.AppendLine("  Duration-> " + linkDownLogEvent._span.TotalMilliseconds + "ms\n");
Run Code Online (Sandbox Code Playgroud)

这就是印刷品的一点......任何人都可以对这种明显的差异有所了解吗?

问题已经得到解答,但我会在这里添加一个编辑以获取更多信息.

编辑:

似乎差异不是Win7和WinXP的差异,而是32位和64位.

Henk指出的32位Windows系统中,系统时钟的粒度为15-16ms,这对于时间跨度小于16ms的每个值都给出了15.625的值.

在64位系统中,系统调用是针对具有更精细粒度的不同方法集.所以在x64的开发机器上,我的系统时钟精度为ms!

现在,秒表通过处理器仪器使用硬件接口来记录更精细的粒度(可能不是每个处理器滴答,但我想象一些与这种想法一致的极其准确的东西).如果操作系统下的硬件没有这种级别的检测,则会使用系统时间.所以要小心!但我猜大多数现代台式机/笔记本电脑都有这种仪器......嵌入式设备或那种性质的东西可能没有,但就我所见,秒表类不在Compact Framework中(这里你必须使用QueryPerformanceCounter( )).

希望这一切都有帮助.这对我帮助很大.

在_spanStopWatch初始化器周围的某处:

    if (!_spanStopWatch.IsHighResolution)
    {
        throw new ThisMachineIsNotAccurateEnoughForMyLikingException("Find a better machine.");
    }
Run Code Online (Sandbox Code Playgroud)

螺母和螺栓:

    public void LinkUp()
    {
        if (_isLinkUp) return;

        _spanStopWatch.Stop();
        var span = _spanStopWatch.Elapsed;
        _downTimeLog.Add(new LinkDown()
                            {
                                _span = span,
                                _status = _ipStatus,
                                _time = _downTime
                            });
        _isLinkUp = true;
    }
Run Code Online (Sandbox Code Playgroud)

Hen*_*man 5

0或15.625(幻数?)

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

使用 System.Diagnostics.Stopwatch更精确的计时.

  • +1; 然后,如果您遇到"秒表"问题,请查看以下问题:http://stackoverflow.com/questions/3400254/can-the-net-stopwatch-class-be-this-terrible (2认同)