2009-10-02 53 views

Trả lời

9

Hệ điều hành máy tính để bàn Windows thực sự không chính xác dưới 40ms. Hệ điều hành đơn giản không phải là thời gian thực và do đó trình bày jitter không xác định đáng kể. Điều đó có nghĩa là trong khi nó có thể báo cáo giá trị xuống đến mili giây hoặc thậm chí nhỏ hơn, bạn không thể thực sự dựa vào những giá trị đó thực sự có ý nghĩa. Vì vậy, ngay cả khi khoảng thời gian Bộ hẹn giờ được đặt thành một số giá trị mili giây phụ, bạn không thể dựa vào thời gian giữa cài đặt và kích hoạt để thực sự là những gì bạn nói bạn muốn.

Thêm vào thực tế này toàn bộ khuôn khổ bạn đang chạy không xác định (GC có thể tạm ngưng bạn và thực hiện việc thu thập thời gian khi Bộ hẹn giờ kích hoạt) và bạn kết thúc với tải và rất nhiều rủi ro đang cố gắng để làm bất cứ điều gì là thời điểm quan trọng.

+0

Nó không quan trọng đặc biệt; Tôi đang viết một "bộ vi xử lý ảo" cho một trò chơi mô phỏng rô-bốt có sử dụng bộ hẹn giờ để thực hiện các hướng dẫn ở tốc độ được chỉ định và tôi chỉ tự hỏi tôi có thể đặt mức cao như thế nào. – RCIX

+1

Tôi sẽ không cố gắng để đi bất kỳ thường xuyên hơn 1ms. Lịch trình hệ điều hành sẽ không làm bất cứ điều gì thường xuyên hơn cho ứng dụng của bạn. – ctacke

+0

Được rồi, cảm ơn thông tin! – RCIX

2

System.Timers.Timer là lạ. Nó sử dụng một đôi như khoảng thời gian nhưng trên thực tế gọi Math.Ceiling trên nó và đúc kết quả như là một int để sử dụng với một System.Threading.Timer cơ bản. Đó là độ chính xác lý thuyết sau đó là 1ms và bạn không thể chỉ định một khoảng thời gian vượt quá 2.147.483.647ms. Với thông tin này, tôi thực sự không biết tại sao một đôi được sử dụng như tham số khoảng thời gian.

2

Một vài năm trước, tôi thấy nó chính xác khoảng 16ms ... nhưng tiếc là tôi không nhớ chi tiết.

+4

Điều đó sẽ là 15.625ms == 64Hz, tần số của đồng hồ hệ thống. –

1

Bạn có thể dễ dàng tìm ra điều này một cách dễ dàng bằng cách thực hiện vòng lặp liên tục lấy mẫu thời gian kết quả và kiểm tra mức chi tiết của nó.

0

Tôi đã so sánh System.Timers.TimerSystem.Threading.Timer - cả hai lỗi này đều có lỗi hệ thống khoảng 8,16 ms, đặc biệt là trong khoảng thời gian nhỏ (1000,,6000 ms). Mỗi cuộc gọi tiếp theo của thói quen hẹn giờ xảy ra với khoảng thời gian tăng từ cuộc gọi đầu tiên. Ví dụ, bộ đếm thời gian với 2000 ms khoảng thời gian cháy vào năm 2000, 4012, 6024, 8036, 10048 mili giây và vv (Dấu thời gian thu được từ Environment.TickCountStopwatch.ElapsedTicks, cả hai đều cho kết quả tương tự).

0

Độ phân giải hẹn giờ chuyển sang chế độ 1ms mà không cần nỗ lực thực hiện nhiều. Tôi vừa mô tả lý do cho độ chính xác của double trong this answer. Khi định cấu hình hệ thống chạy ở mức 1024 điểm ngắt mỗi giây (sử dụng API hẹn giờ đa phương tiện), thời gian được ngắt là 0,9765625 mili giây. Độ phân giải tiêu chuẩn cho các vấn đề thời gian là 100ns. Những giá trị này được lưu trữ dưới dạng số nguyên. Giá trị 0.9765625 không thể được lưu trữ mà không mất độ chính xác trong một số nguyên ở độ phân giải 100 ns. Chữ số cuối cùng (5) đại diện cho 500 ps. Do đó độ phân giải phải cao hơn ba bậc. Lưu trữ các giá trị trong các số nguyên với độ phân giải 100 ps là vô vọng vì số nguyên 8 byte ở độ phân giải 100 ps sẽ bao phủ hơn khoảng 21350 ngày hoặc khoảng 58 năm. Khoảng thời gian này quá ngắn để được mọi người chấp nhận (hãy nhớ kịch bản Y2K!).

Xem câu trả lời được liên kết để tìm hiểu thêm về chi tiết.

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