【发布时间】:2014-07-24 21:34:10
【问题描述】:
我需要一个像 Stopwatch.GetTimestamp() 这样的时钟
- 获取值时开销很小
- 至少精确到 1 毫秒(不减少 os 宽计时器间隔)
- 不必与一天中的实际时间挂钩(例如
DateTime.Now是) - 单调增加,但不一定严格(在同一毫秒内以 1 毫秒的精度多次调用它会产生相同的值)
- 保持上述所有内容在多个内核和处理器上同时运行
Stopwatch 好像是fail to provide the last of these properties:
在多处理器计算机上,哪个处理器无关紧要 线程继续运行。但是,由于 BIOS 或硬件中的错误 抽象层(HAL),你可以得到不同的时序结果 不同的处理器。要指定线程的处理器亲和性,请使用 ProcessThread.ProcessorAffinity 方法。
为了实现真正的并发,出于显而易见的原因,我无法将所有线程固定到单个处理器。
我可以在 .net 中使用任何替代方法吗?还是上述警告已过时/仅限于一些稀有模型(我的生产环境不太可能容纳)?
编辑:
这是我主要关心的问题:我不介意不同处理器上的值相差一(例如毫秒)左右,但无论从哪个处理器检索它们,它们都需要始终或多或少相同。
【问题讨论】:
-
如果是由于 BIOS 或 HAL 中的错误,我怀疑你会找到一个可以做得更好的软件。
-
Environment.TickCount64够吗?不过,不确定它有 1 毫秒的分辨率。 -
@usr 你打算为我实现它 - 或者它只是从 the docs 中丢失?
-
@EugeneBeresovksy 呵呵,我很确定我在框架的最新版本中看到了 64 位版本的 TickCount。还是只是一个功能请求?!
-
好的,所以有一个可以使用的本机函数 GetTickCount64。您可能必须将其精度设置为 1 毫秒。请参阅blogs.msdn.com/b/sloh/archive/2005/04/05/405724.aspx 了解如何使用 32 位版本。
标签: .net multiprocessing clock multicore