多核和线程感知的 .Net 计时器?

14

众所周知,在多线程异步应用程序中运行时可以在所有核心上发生问题的秒表

  

在多处理器计算机上,线程运行的处理器并不重要。但是,由于BIOS或硬件抽象层(HAL)中存在的错误,您可能会在不同的处理器上获得不同的计时结果。要为线程指定处理器亲和性,请使用ProcessThread.ProcessorAffinity方法。

有什么可靠的方式可以获取一些具有高分辨率/精度且跨CPU核心一致的刻度/时间戳等值吗?

如果无法使秒表(QueryPerformanceCounter)在多核安全,则下一个最佳方法是什么以跨核心获得良好的时间戳? DateTime.UtcNow.Ticks 或者 Environment.TickCount ?还有其他计数器吗?

我确实需要比DateTime.UtcNow.Ticks提供的更好的分辨率。(10-15ms)

2个回答

7

我自己曾经搜索过这个特定问题的答案,最好的解决方法是使用 DateTime.UtcNow。似乎没有 Windows 公开的高分辨率和可靠的计数器(我已经谷歌搜索了很长时间,但还是找不到)。


5

根据官方文档,在Windows XP之后的多处理器系统上使用StopWatch/QueryPerformanceCounter应该是没有问题的。如果系统不支持不变TSC,则QPC将自动使用其他计时器策略。

但请注意评论部分中虚拟化系统的情况。在这种特定情况下需要小心。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接