到目前为止,我用于DateTime.Now
获取时间戳,但我注意到,如果DateTime.Now
在一个循环中打印,会看到它在不连续跳跃时增加约。15毫秒。但是对于我的应用程序中的某些场景,我需要获得最准确的时间戳,最好使用tick(= 100 ns)精度。有任何想法吗?
更新:
显然,StopWatch
/ QueryPerformanceCounter
是要走的路,但它只能用于测量时间,所以我在考虑调用DateTime.Now
应用程序何时启动,然后只是StopWatch
运行,然后将经过的时间添加StopWatch
到返回的初始值DateTime.Now
。至少应该给我准确的相对时间戳,对吗?你怎么看待这个?
注意:
StopWatch.ElapsedTicks
不同于StopWatch.Elapsed.Ticks
!我用前者假设1个tick = 100ns,但在这种情况下1个tick = 1 / StopWatch.Frequency
。所以得到相当于DateTime使用的滴答StopWatch.Elapsed.Ticks
。我刚刚学会了这个难题。
笔记2:
使用StopWatch方法,我发现它与实时不同步。大约10个小时后,它超前了5秒。所以我想我们不得不重新同步它每隔X左右,其中X可能是1小时,30分钟,15分钟等我不确定什么是最佳时间再同步将是因为每个resync会改变偏移量可以是最多20毫秒。
发布于 2018-03-19 12:35:53
如果你真正关心的实际上是一个独特的时间戳,它是按严格升序排列的,并且尽可能接近系统时间,你可以尝试这种替代方法:
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;
}
}
}
https://stackoverflow.com/questions/-100003196
复制相似问题