2011-12-12 94 views
2

完成从这篇文章http://blogs.msdn.com/b/ericlippert/archive/2010/04/08/precision-and-accuracy-of-datetime.aspx经过时间20毫秒精度

现在的问题,“多少时间已经从开始到完成经过?”比“什么时候它是一个完全不同的问题现在?“如果你想问的问题是某个操作需要多长时间,并且你想要一个高精度,高精度的答案,那么使用StopWatch类。它确实具有接近精度的纳秒精度和精度。

问题是 - 如果我需要从开始到结束所需的时间,我需要使用什么,我需要20毫秒的精度?

StopWatch有更好的精度,所以我恐怕我会支付处理器时间,因为我不需要“超精度”。

DateTime.Now具有我需要的精确度,但它也有很多额外的东西,如月,年等,我再次担心这会让它慢得多。

+3

我会使用StopWatch,不用担心额外精度的任何开销。 –

+4

一旦出现问题就担心表现,90%的情况下这种差异根本就不会影响 –

+0

@SebastianPiu我在写新鲜的代码,我应该选择这种或那种方式。他们两者同样难以实施并具有同等可读性。即使性能不是问题,我也想选择最快的方式,因为没有其他参数需要比较。 – javapowered

回答

3

这篇文章应该可以帮助您:

http://www.dijksterhuis.org/timing-function-performance-stopwatch-class/

一般来说它说,秒表是更好的选择,这是连我个人的看法。

+0

但请注意,即使tick为0.1 ms,结果也不如此,因为每次更新只能在15到55ms之间完成,具体取决于硬件。您可以在JürgenBayer的“c#代码簿”中找到更精确的方法(或者在代码项目中搜索“高精度”秒表) –

1

StopWatch的唯一(可观的)开销是QueryPerformanceFrequency的组合,以确定StopWatch是否将以高分辨率频率继续。实际上,只有当它没有高分辨率频率时,它才是开销。否则是更快的选项,因为它使用WIN32 QueryPerformanceCounter调用而不是DateTime.UtcNow.Ticks获取时间戳。

0

从我在互联网上阅读到现在,直到StopWatch System.Diagnostics命名空间类是用于计时的最佳类。

如果您希望精度在1毫秒以下,请记住使用Elapsed.TotalMilliseconds属性检索已用时间,则sw.ElapsedMilliseconds将以1毫秒的增量跳转。

using System; 
using System.Diagnostics; 

namespace MySolution 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var sw = Stopwatch.StartNew(); 

      // code to be timed here 

      sw.Stop(); 
      Console.WriteLine("Run time in ms = {0}", sw.Elapsed.TotalMilliseconds); 
     } 
    } 
}