当我运行以下代码时,它显示经过的时间等于零但是当我评论第一行时,它显示经过的时间等于20ms!为什么呢?
调用System.DateTime.Now是否在运行时加载了一些内容,这会产生差异?
string time1 = System.DateTime.Now.ToString();
var sw = System.Diagnostics.Stopwatch.StartNew();
string time = System.DateTime.Now.ToString();
string te = sw.ElapsedMilliseconds.ToString(); ;
Console.WriteLine(te);
sw.Stop();
答案 0 :(得分:3)
首先,永远不会在Debug
中进行分析。此外,即使在Release
中,也永远不会附加调试器。您的结果是倾斜并且没有实际价值。
Release
中的此代码需要0
毫秒。我执行了它并验证了输出。以下是输出:
0
Press any key to continue . . .
答案 1 :(得分:1)
在反汇编mscorlib
并分析结果后,DateTime.Now
可能会造成20毫秒的延迟。
至少在.NET Framework 4.0版中,该属性调用内部TimeZoneInfo.GetDateTimeNowUtcOffsetFromUtc()
方法。反过来,该方法调用TimeZoneInfo.s_cachedData.GetOneYearLocalFromUtc()
,这可能会在第一次调用时显示性能损失(当数据尚未缓存时)。
根据该调用的结果,TimeZoneInfo.GetDateTimeNowUtcOffsetFromUtc()
也可以调用TimeZoneInfo.GetIsDaylightSavingsFromUtc()
,这是非常重要的,涉及日期算术。
答案 2 :(得分:-2)
导致延迟的DateTime.Now
不是真的,而是ToString
部分的更多。