在C#中实现高分辨率DateTime.UtcNow的最佳方法?

在C#中实现高分辨率DateTime.UtcNow的最佳方法?,第1张

概述我正在尝试实施时间服务,报告时间的准确性超过1毫秒.我认为一个简单的解决方案是进行初始测量并使用StopWatch为其添加增量.问题是这种方法似乎与墙壁时间相差很快.例如,以下代码尝试测量Wall Time和我的高分辨率时钟之间的差异: public static void Main(string[] args){ System.Diagnostics.Stopwatch s = new 我正在尝试实施时间服务,报告时间的准确性超过1毫秒.我认为一个简单的解决方案是进行初始测量并使用StopWatch为其添加增量.问题是这种方法似乎与墙壁时间相差很快.例如,以下代码尝试测量Wall Time和我的高分辨率时钟之间的差异:
public static voID Main(string[] args){    System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();    DateTime baseDateTime = DateTime.UtcNow;    s.Start();    long counter = 0;    while(true)    {        DateTime utcNow = DateTime.UtcNow;        DateTime hpcutcNow = baseDateTime + s.Elapsed;        Console.Writeline(String.Format("{0}) DT:{1} HP:{2} DIFF:{3}",++counter,utcNow,hpcutcNow,utcNow - hpcutcNow));        Thread.Sleep(1000);    }}

在相当近期的服务器硬件上,我以大约2毫秒/分钟的速度发散.

窗户中是否还有其他时间设施我不知道会更准确?如果没有,是否有更好的方法来创建我应该使用的高分辨率时钟或第三方库?

@H_404_9@解决方法 获得准确的时钟很困难.秒表具有非常高的分辨率,但它不准确,从芯片组中的信号中获得其频率.它以典型的电子部件公差运行.硬件业务的激烈竞争优先于昂贵的晶体振荡器,其频率保证稳定.

DateTime.UtcNow也不是那么准确,但它得到了帮助. windows会定期联系时间服务,默认情况下是time.windows.com以获取高质量时钟的更新.并使用它来重新校准机器的时钟,插入小的调整以使时钟赶上或减速.

你需要更多更大的技巧才能将其精确到毫秒级.对于在内核模式下运行,以中断优先级运行的代码,您只能获得类似的保证,因此它不会被其他代码抢占,并且其代码和数据页被锁定,因此不会被页面错误命中.商业解决方案使用GPS无线电读取GPS卫星的时钟信号,由在烘箱中运行的振荡器支持以提供温度稳定性.读取这样一个时钟是一个难题,当你使用它的程序可以被 *** 作系统抢占时,你没有太多用于亚毫秒时钟源,就像它获得时间并且不再开始运行一样~45毫秒后.或者更糟.

由于时间服务更新,DateTime.UtcNow精确到15.625毫秒并且在很长时间内保持稳定.低于这个没有多大意义,你无法在用户模式下获得所需的执行保证以利用它.

总结

以上是内存溢出为你收集整理的在C#中实现高分辨率DateTime.UtcNow的最佳方法?全部内容,希望文章能够帮你解决在C#中实现高分辨率DateTime.UtcNow的最佳方法?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1237300.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存