我知道DateTime.Now
(或DateTime.UtcNow
)只能精确到系统定时器分辨率。有一个“无证”功能NtSetTimerResolution但它doesn't affect the current time。我已经在使用一个起始值为DateTime.UtcNow
的混合解决方案和一个添加的Stopwatch
计数器,可以实现最高精度达几微秒。实际上这很好,它不能与系统上多个进程的时间值进行比较。什么时候更新DateTime.Now?
我想进一步校准我的基准时间。如果DateTime.Now
的准确度不能提高,至少我想知道它的值何时更新为下一个值。我正在考虑一个循环,直到数值发生变化,然后使用它并立即启动秒表。
事情是这样的:(未经测试)
DateTime t0 = DateTime.UtcNow;
DateTime baseTime;
Stopwatch stopwatch = new Stopwatch();
while ((baseTime = DateTime.UtcNow) == t0);
stopwatch.Start();
是我的假设是正确的那等着更改数值让我在报告值是准确的时刻?例如,如果我在所有报告给一个通用日志的应用程序中都这样做,那么我应该得到比现在更可比的时间值。 (我不希望得到同步级精度虽然,只是更好的信息。)
我已经做了的NtSetTimerResolution功能的小测试,达到将其设置为最大分辨率和环型比较DateTime.UtcNow
值,那么。看起来这些值更加精确/准确(这里无法区分)。但我不确定我在这里看到什么。目前该计划开始时的分辨率每次都不同。不确定它是否会干扰其他进程,所以我不想在生产代码中修改它。
你真的*只是*有兴趣订购?你在说什么“准确”? (当然,“绝对”精度取决于系统时钟对某些绝对时钟的精确度,例如NTP服务器)。 –
如果您对更严格的时间测量感兴趣,那么严格的while循环会消耗大量的CPU周期。 ..并可能会影响您正在测量的任务。 –
局部精度就足够了。 Windows默认情况下每隔几天使用一个NTP源,那就行了。当然这个循环只在进程初始化时完成。此外,我将使用'baseTime.Add(stopwatch.Elapsed)'。循环应该不超过16毫秒。 – ygoe