2012-11-06 46 views
9

(忽略優化的編譯器標誌)DateTime精度?

是否可以讓這段代碼在某些系統上進入塊?

if (Datetime.Now!=Datetime.Now) 
{ 
... 
} 

我的意思是,它是如何評估這裏的值? (是按順序)?

有沒有什麼情況下可能爲真?

再次,忽略的優化標誌。

+1

在一個非常緩慢的系統上,我想。您只需要在通話之間留出1個嘀嗒聲,以使它們與衆不同。 – leppie

+4

我喜歡這個答案http://stackoverflow.com/a/2143784/570150 – V4Vendetta

+0

@leppie其中「tick」表示系統計時器正在運行,而不是代表100ns的「Tick」單元。 – CodesInChaos

回答

4

DateTime.Now電話:

public static DateTime Now 
{ 
    get 
    { 
     return DateTime.UtcNow.ToLocalTime(); 
    } 
} 

其內部調用:

public static DateTime UtcNow 
{ 
    get 
    { 
     long systemTimeAsFileTime = DateTime.GetSystemTimeAsFileTime(); 
     return new DateTime((ulong)(systemTimeAsFileTime + 504911232000000000L | 4611686018427387904L)); 
    } 
} 

其中GetSystemTimeAsFile是WindowsAPI函數返回系統時鐘信息。精準度取決於系統,所以。

如果你有一個延遲,針對不同的之間的一些原因得到(DateTime.Now)它可能產生足夠的不同結果是相等比較失敗。但我個人從未遇到過這種情況。

+0

人力資源招聘:-) hhhh –

+1

好吧,不:)如果有人會問這樣的問題,我只能給**猜測**,不知道在這之後,前面的人會對我有什麼瞭解:) – Tigran

5

DateTime的精度爲100ns。但是在典型的實現中,DateTime.Now每隔幾毫秒只能改變一次。

Datetime.Now != Datetime.Now可能是真實的,但它不太可能發生。這是您經常在多線程代碼中看到的典型競態條件。即不應依賴DateTime.Now不改變,而是將副本存儲在局部變量中。內部

+0

它與計算機頻率時鐘有關嗎? –

+0

這涉及到一個內部系統計時器,影響定時器,'Thread.Sleep','DateTime.Now','Environment.TickCount',線程切換... – CodesInChaos

+0

如果我沒有記錯'DateTime.Now'是相對昂貴的它使用IO。存儲副本的另一個原因。編輯:這是我指的鏈接:http://stackoverflow.com/q/10899709/284240 –