2012-11-06 40 views
9

(bỏ qua cờ trình biên dịch được tối ưu hóa)Độ chính xác ngày giờ?

có thể mã này sẽ nhập khối trên một số hệ thống không?

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

Ý tôi là, nó đánh giá các giá trị ở đây như thế nào? (theo thứ tự)?

Có bất kỳ tình huống nào trong đó điều kiện có thể là đúng không?

lại, bỏ qua cờ được tối ưu hóa.

+1

Trên hệ thống thực sự chậm, tôi đoán vậy. Bạn chỉ cần một đánh dấu 1 gian hàng giữa các cuộc gọi để làm cho họ khác nhau. – leppie

+4

Tôi yêu câu trả lời này http://stackoverflow.com/a/2143784/570150 – V4Vendetta

+0

@leppie trong đó "đánh dấu" có nghĩa là bộ hẹn giờ hệ thống đang chạy và không phải là đơn vị 'Tick' đại diện cho 100ns. – CodesInChaos

Trả lời

4

DateTime.Now cuộc gọi nội bộ:

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

trong đó kêu gọi trong nội bộ:

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

nơi GetSystemTimeAsFile là WindowsAPI chức năng trả lại hệ thống thông tin đồng hồ. Sự chính xác phụ thuộc vào hệ thống, vì vậy.

Nếu bạn có sự chậm trễ, vì một số lý do giữa các lần nhận khác nhau (DateTime.Now), có thể tạo ra kết quả đủ khác nhau để so sánh bình đẳng không thành công. Nhưng tôi, cá nhân, chưa bao giờ gặp loại tình trạng này theo kinh nghiệm của tôi.

+0

Nhân sự tuyển dụng :-) hhhh –

+1

tốt, không :) nếu có ai đó hỏi một câu như thế này, tôi chỉ có thể cho ** đoán **, không biết anh chàng nào ở phía trước sẽ tìm hiểu về tôi sau này :) – Tigran

5

DateTime có độ chính xác 100ns. Nhưng trên các triển khai điển hình, DateTime.Now chỉ thay đổi sau vài mili giây.

Datetime.Now != Datetime.Now có thể đúng, nhưng rất khó xảy ra. Đây là một điều kiện chủng tộc điển hình của loại bạn thường thấy trong mã đa luồng. tức là bạn không nên dựa vào DateTime.Now không thay đổi mà lưu trữ một bản sao trong một biến cục bộ.

+0

là nó liên quan đến đồng hồ tần số máy tính bằng cách nào đó? –

+0

Nó liên quan đến bộ đếm thời gian hệ thống nội bộ ảnh hưởng đến bộ hẹn giờ, 'Thread.Sleep',' DateTime.Now', 'Environment.TickCount', chuyển đổi luồng, ... – CodesInChaos

+0

Nếu tôi nhớ chính xác' DateTime.Now' là tương đối đắt nó sử dụng IO. Một lý do khác để lưu trữ một bản sao. Chỉnh sửa: Đây là liên kết tôi đang đề cập đến: http://stackoverflow.com/q/10899709/284240 –

Các vấn đề liên quan