C# 日期时间精度?
(忽略优化编译器标志) 在某些系统上,该代码是否会进入阻塞C# 日期时间精度?,c#,.net,datetime,C#,.net,Datetime,(忽略优化编译器标志) 在某些系统上,该代码是否会进入阻塞 if (Datetime.Now!=Datetime.Now) { ... } 我的意思是,它如何评估这里的值?(是点菜的吗) 是否存在条件可能为真的情况 同样,忽略优化标志。DateTime的精度为100ns。但在典型的实现中,DateTime.Now仅每隔几毫秒更改一次 Datetime.Now!=Datetime.Now可能是真的,但这极不可能发生。这是多线程代码中常见的典型竞争条件。i、 e.不应依赖于DateTime.No
if (Datetime.Now!=Datetime.Now)
{
...
}
我的意思是,它如何评估这里的值?(是点菜的吗)
是否存在条件可能为真的情况
同样,忽略优化标志。
DateTime
的精度为100ns。但在典型的实现中,DateTime.Now
仅每隔几毫秒更改一次
Datetime.Now!=Datetime.Now
可能是真的,但这极不可能发生。这是多线程代码中常见的典型竞争条件。i、 e.不应依赖于DateTime.Now
不更改,而应将副本存储在局部变量中。DateTime.Now
内部调用:
public static DateTime Now
{
get
{
return DateTime.UtcNow.ToLocalTime();
}
}
它在内部呼吁:
public static DateTime UtcNow
{
get
{
long systemTimeAsFileTime = DateTime.GetSystemTimeAsFileTime();
return new DateTime((ulong)(systemTimeAsFileTime + 504911232000000000L | 4611686018427387904L));
}
}
其中是返回系统时钟信息的WindowsAPI函数。精度取决于系统,所以
如果由于某种原因,在不同的get(
DateTime.Now
)之间存在延迟,可能会产生不同的结果,导致相等比较器失败。但就我个人而言,我从未遇到过这种情况。它与计算机频率时钟有某种关系吗?它与影响计时器的内部系统计时器有关,线程。睡眠,,日期时间。现在,,环境。滴答声
,线程切换,…如果我没记错的话,DateTime。现在
使用IO,成本相对较高。存储副本的另一个原因。编辑:这里是我指的链接:@TimSchmelter它很昂贵,因为它需要进行时区转换。好吧,得到零件的实际时间相当便宜。在我的compDateTime.UtcNow
成本为9ns,DateTime.Now
成本为900ns。我想在一个非常慢的系统上。你只需要在两次调用之间暂停1个刻度就可以使它们不同。我喜欢这个答案@leppie,其中“刻度”表示系统计时器正在运行,而不是表示100ns的tick
单位。@CodesInChaos:不,我是指后者。或者至少是某种形式的四舍五入,例如49.9ns vs 50ns
@RoyiNamir它会显示那些数字是的,但你会看到它们不会单独改变。如果有人问这样的问题,我只能猜测,不知道在这之后前面的人会对我有什么看法:)