gpt4 book ai didi

.net - Stopwatch.GetTimestamp() 替代方案在多个处理器上是安全的

转载 作者:行者123 更新时间:2023-12-02 03:37:19 27 4
gpt4 key购买 nike

我需要一个像 Stopwatch.GetTimestamp() 这样的时钟

  1. 获取值时的开销很小
  2. 精确到至少 1 毫秒(不减少操作系统范围的计时器间隔)
  3. 不必与一天中的实际时间 Hook (例如 DateTime.Now 就是这样)
  4. 单调增加,但不一定严格(在同一毫秒内以 1 毫秒的精度调用多次将产生相同的值)
  5. 保持上述所有内容在多个内核和处理器上同时运行

秒表似乎fail to provide the last of these properties :

On a multiprocessor computer, it does not matter which processor the thread runs on. However, because of bugs in the BIOS or the Hardware Abstraction Layer (HAL), you can get different timing results on different processors. To specify processor affinity for a thread, use the ProcessThread.ProcessorAffinity method.

为了实现真正的并发,出于显而易见的原因,我无法将所有线程固定到单个处理器。

我可以在 .net 中使用任何替代方案吗?或者上述警告是否已过时/仅限于某些罕见型号(我的生产环境不太可能容纳)?

编辑:

这是我主要关心的问题:我不介意不同处理器上的值相差一(例如毫秒)左右,但无论从哪个处理器检索它们,它们都需要始终或多或少相同。

最佳答案

MS 实际上有一篇关于秒表底层计数器的深入文章。 Acquiring high-resolution time stamps

相关摘录:

<小时/>

一般来说,性能计数器结果在多核和多处理器系统中的所有处理器上都是一致的,即使是在不同线程或进程上测量时也是如此。以下是此规则的一些异常(exception)情况:

  • 在某些处理器上运行的 Windows Vista 之前的操作系统可能会违反此一致性,原因如下:
    • 硬件处理器具有非不变的 TSC,并且 BIOS 无法正确指示此情况。
    • 所使用的 TSC 同步算法不适合具有大量处理器的系统。
  • 当您比较从不同线程获取的性能计数器结果时,请考虑相差 ± 1 个刻度的值以产生不明确的排序。如果时间戳取自同一线程,则此 ± 1 刻度不确定性不适用。在这种情况下,术语“tick”指的是等于 1 ÷(从 QueryPerformanceFrequency 获得的性能计数器的频率)的时间段。

关于.net - Stopwatch.GetTimestamp() 替代方案在多个处理器上是安全的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24033969/

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