0

我已经启动了一个Stopwatch的实例,并想从另一个线程中读取它的 ElapsedMilliseconds:

var diff = myStopwatch.ElapsedMilliseconds - someOtherValue;

但是,我已经阅读了编译器优化代码,假设它运行在同一个线程上,这可能导致上面的行从注册表中读取一个值,而不是在它执行的精确时间点获取实际值。这会影响我吗?如果是这样,我该如何解决?

4

1 回答 1

2

秒表调用QueryPerformanceCounter() winapi 函数,优化不会以任何方式影响它。winapi函数依赖HAL,硬件抽象层提供计数器源。最典型的是芯片组中可用的计数器。不同的机器使用不同的芯片组,这就是 Stopwatch.Frequency 属性暴露的原因。并且相应地不同的 HAL 实现,因此不能硬保证您的主板没有 cooties。Microsoft 在 MSDN 文章中使用此说明来承担该责任:

在多处理器计算机上,调用哪个处理器并不重要。但是,由于基本输入/输出系统 (BIOS) 或硬件抽象层 (HAL) 中的错误,您可能会在不同的处理器上获得不同的结果。要指定线程的处理器亲和性,请使用 SetThreadAffinityMask 函数。

这种错误在 20 年前并不少见,今天闻所未闻。

于 2013-10-06T20:26:40.823 回答