我需要像Stopwatch.GetTimestamp()
这样的时钟
DateTime.Now
) Stopwatch
似乎fail to provide the last of these properties:
在多处理器计算机上,哪个处理器无关紧要 线程运行。但是,由于BIOS或硬件中的错误 抽象层(HAL),您可以获得不同的计时结果 不同处理器。要指定线程的处理器关联,请使用 ProcessThread.ProcessorAffinity方法。
为了实现真正的并发性,出于显而易见的原因,我无法将所有线程都固定到单个处理器上。
我可以在.net中使用的任何替代方案吗?或者上述警告是否过时/仅限于某些罕见的模型(我的生产环境不太可能存在)?
修改
这是我的主要关注点:我不介意在不同的处理器上关闭一个(例如毫秒)左右的值,但无论从哪个处理器中检索它们,它们都必须总是或多或少相同。 / p>
答案 0 :(得分:2)
MS实际上有关于Stopwatch
底层的计数器的深入文章。 Acquiring high-resolution time stamps
相关摘录:
通常,性能计数器结果在多核和多处理器系统中的所有处理器上都是一致的,即使在不同的线程或进程上进行测量也是如此。以下是此规则的一些例外情况:
答案 1 :(得分:1)
The way it is even on buggy systems实际上已经足够好(对我来说):
GetTimestamp() - stampTakenEarlierOnADifferentProcessor
的结果可能会变为负数 - 某些应用程序存在问题,但不适用于我的用例答案 2 :(得分:-1)
由于你只需要间隔测量你的秒表,但你不能从不同的处理器上运行的不同线程访问同一个实例(如果我理解你的话,如果我错了,请告诉我),你可以创建一个每个线程的新实例:
ThreadLocal<Stopwatch> watch = new ThreadLocal<Stopwatch>(() => new Stopwatch());
每个实例应正确计算从开始时起的时间间隔。
作为替代方案,您可以获取DateTime.Now
属性并根据需要发送文本。它与.GetTimeStamp()
具有相同的语义(对我而言)。