0

检查代码

        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 次相同的结果,这意味着即使我将毫秒乘以 100000000 次,DateTime.UtcNow 也不会改变。

这里有人知道如何每次都获得新鲜的 DateTime.UtcNow 吗?

4

3 回答 3

3

在如此紧密的循环中,机会确实很好,您将获得相同的时间。

属性中的每个刻度Ticks代表一个 100 纳秒的切片。您的代码会比这更快地迭代。

于 2011-12-08T19:33:59.773 回答
0

我只是将您的代码段放在 LinqPad 中,并t.TotalMilliseconds.Dump()在 for 循环结束之前添加了一个,这是前几个结果:

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

循环执行得相当快,您在小数点后看到小数毫秒。

于 2011-12-08T19:37:53.550 回答
0

最好的方法是使用System.Diagnostics.Stopwatch类来测量高分辨率的时间跨度。在大多数计算机上,默认时钟间隔为 15.625 毫秒,这意味着在一个时钟间隔内,使用检索的两个时间戳之差DateTime.UtcNow将为 0。 Stopwatch只要可用(即在大多数 PC 上),就使用 perf 计数器,并且分辨率通常小于 1 us。有关更多详细信息,请参阅托管代码中的时间跨度测量。

于 2016-05-15T20:26:16.697 回答