为了账号安全,请及时绑定邮箱和手机立即绑定

如何获取.NET / C#中的滴答精度时间戳?

如何获取.NET / C#中的滴答精度时间戳?

慕神8447489 2019-11-28 14:04:31
到目前为止,我一直使用DateTime.Now时间戳记,但是我注意到,如果您DateTime.Now循环打印,您会发现它以大约5%的离散跳跃递增。15毫秒 但是对于我的应用程序中的某些情况,我需要获得最准确的时间戳,最好是滴答(= 100 ns)精度。有任何想法吗?更新:显然,StopWatch/ QueryPerformanceCounter是要走的路,但是它只能用于测量时间,因此我在考虑DateTime.Now在应用程序启动时调用,然后才StopWatch运行,然后将经过的时间从添加到从StopWatch返回的初始值中DateTime.Now。至少那应该给我准确的相对时间戳,对吗?您如何看待(黑客)?注意:StopWatch.ElapsedTicks不同于StopWatch.Elapsed.Ticks!我使用前者假设1 tick = 100 ns,但在这种情况下1 tick = 1 / StopWatch.Frequency。因此,要获取等于DateTime的报价,请使用StopWatch.Elapsed.Ticks。我只是很难学到的。笔记2:使用StopWatch方法,我注意到它与实时不同步。大约10个小时后,它领先了5秒钟。因此,我想每个X都必须重新同步一次,其中X可能是1小时,30分钟,15分钟等。我不确定重新同步的最佳时间间隔是多少,因为每次重新同步都会改变偏移量,长达20毫秒。
查看完整描述

3 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

如果实际上(您的评论)真正关心的是一个唯一的时间戳,该时间戳以严格的升序分配,并且尽可能与系统时间相对应,则可以尝试以下替代方法:


public class HiResDateTime

{

   private static long lastTimeStamp = DateTime.UtcNow.Ticks;

   public static long UtcNowTicks

   {

       get

       {

           long orig, newval;

           do

           {

               orig = lastTimeStamp;

               long now = DateTime.UtcNow.Ticks;

               newval = Math.Max(now, orig + 1);

           } while (Interlocked.CompareExchange

                        (ref lastTimeStamp, newval, orig) != orig);


           return newval;

       }

   }

}


查看完整回答
反对 回复 2019-11-28
  • 3 回答
  • 0 关注
  • 725 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信