2012-11-06 5 views
9

DateTime 정밀도?

가이 코드는 일부 시스템에서 블록을 입력 것이라고 할 수있다 (최적화 된 컴파일러 플래그를 무시)?

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

내 말은, 여기 값을 어떻게 평가합니까? (순서대로)?

일 수있는 상황이 있습니까?

다시 최적화 플래그를 무시합니다.

+1

정말 느린 시스템에서 나는 추측합니다. 서로 다른 통화를하기 위해 통화 사이에 1 tick 스톨이 필요합니다. – leppie

+4

나는이 대답을 좋아했다. http://stackoverflow.com/a/2143784/570150 – V4Vendetta

+0

@leppie "tick"은 시스템 타이머가 실행되는 것을 의미하고, Tick은 100ns를 나타내지 않는다. – CodesInChaos

답변

4

DateTime.Now 통화 :

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

내부 호출은 GetSystemTimeAsFile 시스템 클럭 정보를 반환하는 함수이다 WindowsAPI

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

. 시스템에 따라 달라질 수 있습니다.

지연이있는 경우 다른 도착 (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', thread switching ...에 영향을 미치는 내부 시스템 타이머와 관련이 있습니다. – CodesInChaos

+0

'DateTime.Now'는 IO를 사용합니다. 사본을 저장할 또 다른 이유. 편집 : 다음은 내가 언급 한 링크입니다 : http://stackoverflow.com/q/10899709/284240 –