【问题标题】:Stopwatch.GetTimeStamp on multiprocessors多处理器上的 Stopwatch.GetTimeStamp
【发布时间】:2014-06-05 05:03:10
【问题描述】:

Stopwatch.GetTimeStamp() 可能会返回different timing results on different processors because of bugs in the BIOS or the Hardware Abstraction Layer

有谁知道这些错误的具体含义是什么?

  1. 不同处理器上的时间戳是否可能完全不相关 - 或者它们最多只会有少量差异(亚毫秒?)?
  2. 不同处理器上的数字是否会随着时间的推移而偏离 - 这实际上会导致上述“时间戳完全不相关”? (我认为不同处理器上的不同频率可能会这样做)

【问题讨论】:

    标签: .net clock stopwatch bios hal


    【解决方案1】:

    那是因为它是在文档中写的:

    Stopwatch 类协助操作与计时相关的 托管代码中的性能计数器。具体来说,频率 字段和 GetTimestamp 方法可以用来代替非托管 Win32 API QueryPerformanceFrequency 和 QueryPerformanceCounter。

    因此出现了使用性能计数器的好处。

    Windows 实现至少有 2 个可能的性能计数器来源,即 HPET、RDTC,这由 ACPI 确定。然而,ACPI 主要是问题所在,大多数制造商实施得很糟糕,因此有时会决定完全忽略 ACPI 建议并采取其他措施。

    在使用 RDTC 时,如果运气不好并且无论如何测量的时间都非常短,那么在另一个 CPU 上进行线程迁移将导致略微负面的结果。但它可能会发生。

    【讨论】:

    • 所以你是说这个 bug 会做的最糟糕的事情是导致它只是一个 super small time 关闭。换句话说,甚至不到 1 毫秒。
    • 当然不是 1 毫秒。更像是1微最大值。但开发人员通常害怕的是负增量。如果稍后的某些代码不支持带符号的差异,或者在条件/分支或计算中假设为正(除以获取某物的传输率......)
    • “否定结果”是指GetTimestamp() - slightlyEarlierTakenStamp 的结果是否定的?在我的特殊情况下这没关系,并且“保证”只有微量关闭在这里就足够了。只需在毫秒的世界中具有可比性。
    • 太棒了。如果您碰巧知道:面对每个处理器的不同频率,它们如何防止漂移?
    • 我认为操作系统尝试使用 1Ghz 基本虚拟频率来操纵频率,方法是在考虑到它时将实际 RDTSC 计数调整为该虚拟频率,乘以某种 virtualfreq/realfreq 因子.在linux中可以随时查询/sys/devices/system/cpu/cpu0/cpufreq/访问核心频率,windows一定有自己的方式(deviceIOControl?);关键是,它有能力做到这一点。在它使用 HPET 的情况下,它没有任何问题(主板上的一个来源)。
    猜你喜欢
    • 2014-07-24
    • 2015-12-29
    • 2012-04-22
    • 2020-02-26
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多