我已经启动了Stopwatch的实例,并希望从另一个线程中读取它的ElapsedMilliseconds:
var diff = myStopwatch.ElapsedMilliseconds - someOtherValue;
但是我已经阅读了编译器优化代码,假设它在同一个线程上运行,这可能导致上面的行从注册表中读取值,而不是在执行它的精确时间点获取实际值。这会影响我吗?如果是这样,我该如何解决呢?
答案 0 :(得分:2)
秒表会调动QueryPerformanceCounter() winapi function,优化不会以任何方式影响它。 winapi函数依赖于HAL,硬件抽象层提供计数器源。最典型的是芯片组中可用的计数器。不同的机器使用不同的芯片组,因为暴露了Stopwatch.Frequency属性。因此,不同的HAL实现,因此没有硬性保证您的主板没有cooties。 Microsoft在MSDN文章中使用此注释承担了此责任:
在多处理器计算机上,调用哪个处理器无关紧要。但是,由于基本输入/输出系统(BIOS)或硬件抽象层(HAL)中的错误,您可以在不同的处理器上获得不同的结果。要指定线程的处理器关联,请使用SetThreadAffinityMask函数。
这种错误在20年前并不完全不常见,今天闻所未闻。