检查代码
StringBuilder s = new StringBuilder();
for (var i = 0; i < 100; i++)
{
TimeSpan t = (DateTime.UtcNow - new DateTime(2010, 1, 1));
ulong timestamp = (ulong)(t.TotalMilliseconds * 100000000);
s.Append("<li>" + timestamp.ToString());
}
你会得到相同的结果100次,这意味着DateTime.UtcNow永远不会改变,即使我将毫秒乘以100000000次。
这里有人知道如何每次都获得新鲜的DateTime.UtcNow吗?
答案 0 :(得分:3)
在这样一个紧凑的循环中,你很有可能获得相同的时间。
Ticks
属性中的每个刻度表示100纳秒的切片。你的代码会比这更快地迭代。
答案 1 :(得分:0)
我只是将你的代码片段放在LinqPad中,并在for循环结束前添加t.TotalMilliseconds.Dump()
,这是前几个结果:
61068982141.4911
61068982143.9916
61068982143.9916
61068982144.4917
61068982144.4917
61068982144.4917
61068982144.4917
61068982144.9918
61068982144.9918
61068982144.9918
61068982144.9918
61068982145.4919
61068982145.4919
61068982145.4919
61068982145.4919
61068982145.992
61068982145.992
61068982145.992
61068982145.992
循环执行得相当快,你在小数点后看到小数ms。
答案 2 :(得分:0)
最好的方法是使用System.Diagnostics.Stopwatch
类来测量高分辨率的时间跨度。在大多数计算机上,默认时钟间隔为15.625 ms,这意味着在一个时钟间隔内,使用DateTime.UtcNow
检索的两个时间戳的差异将为0. Stopwatch
在可用时使用perf计数器(即在大多数PC上)分辨率通常小于1 us。有关详细信息,请参阅Time Span Measurement in Managed Code。