gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:41:14 25 4
gpt4 key购买 nike

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

就是这个意思。我在使用 .Net4 的 Win7 机器上开发它,并且不得不把它放在一组 XP 笔记本电脑上。

问题是我的盒子上的持续时间值在测试期间显示很好的 ms 持续时间,在 XP 盒子上当我看时它们显示 0 或 15.625(魔数(Magic Number)?)...并且字符串中有有趣的方框符号?

    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 位的差异。

在 32 位 Windows 系统中为 Henk指出,系统时钟的粒度是 15-16ms,这就是时间跨度小于 16ms 的每个值给我 15.625 的值。

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

现在,秒表通过处理器仪表使用硬件接口(interface)来记录更精细的粒度(可能不是每个处理器滴答声,但我想象一些符合这种想法的非常准确的东西)。如果操作系统底层的硬件没有这种级别的检测,它将使用系统时间。所以当心!但我想大多数现代台式机/笔记本电脑都有这种仪器......嵌入式设备或那种性质的东西可能没有,但据我所知,秒表类不在紧凑型框架中(在这里你必须使用 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;
}

最佳答案

0 or 15.625 (magic number?)

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

使用 System.Diagnostics.Stopwatch 获得更准确的计时。

关于c# - 32 位和 64 位 Windows 之间的日期时间粒度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7833255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com