我在一段时间关键的代码中使用System.DateTime.Now.Ticks
,并发现它是一个瓶颈。这几乎可以肯定是由于实例化幕后发生的DateTime
类的开销。
有人告诉我,我可以从System.Environment.TickCount
获取此信息。然而,这是以毫秒为单位,这对于我需要的测量来说太粗糙了。虽然这大约快了两倍。
有没有办法在没有构建System.DateTime.Now.Ticks
的开销的情况下获得System.DateTime.Now
的准确性?
答案 0 :(得分:4)
许多微控制器都有一个实时时钟,它运行32768 Hz晶振,为纹波定时器或内置于硬件中的脉冲计数器供电。
例如,本文件: http://www.ghielectronics.com/downloads/FEZ/Beginners%20guide%20to%20NETMF.pdf 第91页介绍了如何在USBIZI设备上使用脉冲计数器。
它也链接到此文档 http://www.keil.com/dd/docs/datashts/philips/lpc23xx_um.pdf 在第二页。 585描述了TickCounterRegister 6.2.2时钟节拍计数器寄存器(CTCR - 0xE002 4004)
因此,您应该能够读取该寄存器以获得65536个刻度的滚动计数。如果两次读取该寄存器之间的经过时间小于0.5秒,则有符号减法,如果小于0,则添加65536将为您提供经过的时间。
答案 1 :(得分:1)
埃里克,
您也理解,当您调用DateTime的Ticks属性时,发生的事情是.NET框架正在将日期和时间(以毫秒为单位)转换为Tick值。换句话说,您返回的Tick值不是经过时间的度量,而只是日期时间结构的转换,它本身以毫秒为单位进行测量。你可能觉得你通过使用Ticks获得了一些高分辨率的计时,但实际上,毫秒就像你使用DateTime一样好。 tick值将经过的毫秒数除以0x2500之类的值,这就是获得高精度数的原因。但请记住,时间仍然以毫秒为单位。
答案 2 :(得分:0)
答案取决于您需要的时间。例如,如果您尝试比较应用程序的同一个运行实例中的两个时间实例,那么您可以尝试使用DateTime.UtcNow,它不会针对区域设置或DST进行调整。
如果需要在特定时间触发事件,请使用Timer(如果您非常关心粒度,可能使用System.Threading.Timer,尽管System.Timers.Timer更易于使用)。
如果由于其他原因需要,请注明。