【发布时间】:2012-02-17 08:13:36
【问题描述】:
在使用 Stopwatch.GetTimestamp() 时,我们发现如果你记录返回值,然后继续调用它并与之前的返回值进行比较,它最终会但不可预测地返回一个小于原始值的值。
这是预期的行为吗?
在生产代码中这样做的目的是为了获得精确到微秒的系统时间。
该技术涉及调用 DateTime.UtcNow 并分别调用 Stopwatch.GetTimestamp() 作为 originalUtcNow 和 originalTimestamp。
从那时起,应用程序只需调用 Stopwatch.GetTimestamp() 并使用 Stopwatch.Frequency 计算与 originalTimestamp 变量的差值,然后将该差值添加到 originalUtcNow。
那么,瞧……一个高效且准确的微秒 DateTime。
但是,我们发现有时 Stopwatch.GetTimestamp() 会返回较小的数字。
这种情况很少发生。我们的想法是在发生这种情况时简单地“重置”并继续。
但是,这让我们怀疑 Stopwatch.GetTimestamp() 的准确性或怀疑 .Net 库中存在错误。
如果您能对此有所了解,请这样做。
仅供参考,根据当前时间戳值、频率和 long.MaxValue,除非是硬件问题,否则它似乎不太可能在我们的生命周期内翻转。
编辑:我们现在“每个线程”计算这个值,然后“钳制它”以观察核心之间的跳转以重置它。
【问题讨论】:
-
当
UtcNow不是微秒精度时,你怎么能有一个“微秒精度的系统时间”?这个数字只能用于精确的时间间隔。 -
对不起。你看我的解释了吗?它只在应用程序启动时调用一次 UtcNow。从那时起,它使用系统时钟并计算差异以获得当前时间。
-
秒表在可以访问或存在于计算机上时使用高分辨率计时器。
-
Acquiring high-resolution time stamps 有关于高性能计数器时间戳的详细说明,并附有插图和常见问题解答。
标签: c# .net timestamp rollover stopwatch