2014-02-09 49 views
2

我知道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值,那么。看起来这些值更加精确/准确(这里无法区分)。但我不确定我在这里看到什么。目前该计划开始时的分辨率每次都不同。不确定它是否会干扰其他进程,所以我不想在生产代码中修改它。

+0

你真的*只是*有兴趣订购?你在说什么“准确”? (当然,“绝对”精度取决于系统时钟对某些绝对时钟的精确度,例如NTP服务器)。 –

+1

如果您对更严格的时间测量感兴趣,那么严格的while循环会消耗大量的CPU周期。 ..并可能会影响您正在测量的任务。 –

+0

局部精度就足够了。 Windows默认情况下每隔几天使用一个NTP源,那就行了。当然这个循环只在进程初始化时完成。此外,我将使用'baseTime.Add(stopwatch.Elapsed)'。循环应该不超过16毫秒。 – ygoe

回答

0

NtSetTimerResolution()的确改变了系统的定时器分辨率。在这个意义上,它看起来非常类似于timeBeginPeriod/timeEndPeriod。但是NtSetTimerResolution可以在支持更高分辨率的硬件上启用低于1ms的定时器分辨率。使用NtQueryTimerResolution来调查限制。运行Windows XP以上的大多数现代硬件都支持0.5毫秒的分辨率。

这是如何影响时间的?那么,在Windows> XP上,系统时间的粒度(系统文件时间)或系统时间的更新时间间隔由系统心跳信号决定,系统心跳信号由定时器分辨率给出。

实例:

1)视窗7,NtQueryTimerResolution返回5000(100毫微秒的单元的最大分辨率)。 NtSetTimerResolution允许将系统心跳设置为0.5 ms。系统时间(使用GetSystemTimeAsFileTime获得适当的分辨率以检测)将以0.5毫秒为单位递增。所以当前时间受到影响,粒度发生了变化。 2)Windows> XP,timeBeginPeriod(1)将系统心跳更改为1毫秒,但时间粒度保持较低。系统时间粒度不取决于Windows XP上的计时器分辨率。

...函数NtSetTimerResolution但它不影响当前时间。

它的确如此。 MSDN:调用timeBeginPeriod时请小心,因为频繁的调用会显着影响系统时钟,系统电源使用情况和调度程序。但是,MS未能在此更新文档;使用Windows 8.1计时方案取消了对系统时间的影响。BTW:timeBeginPeriodtimeEndPeriod确实使用NtSetTimerResolution

提示:在系统时间转换时调用NtSetTimerResolution,timeBeginPeriod和timeEndPeriod以减少影响。这可以通过在呼叫之前轮询系统时间转换来完成。

...添加了秒表计数器,可实现最高精度达数微秒。不幸的是Stopwatch不考虑系统时间调整。你必须查询实际的系统时间调整(GetSystemTimeAdjustment并应用此调用秒表频率获得的增益

摘要:是不是更...精确/准确的(不能区分?这里)它有一个更细的粒度,这意味着两个:精密度和准确度

注:大约有如下描述在高频心跳运行系统投诉微软指出,功耗为提高多达25%,其他人写的是由于高频心跳而导致的大量兆瓦损失,与往常一样,你付出的代价越大,你得到更多。

相关问题