2011-12-12 128 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); 
     } 
    } 
}