2011-12-07 37 views
5

Trong API Win32 có một hàm QueryPerformanceCounter truy vấn giá trị của bộ đếm thời gian hiệu suất có độ phân giải rất cao.Bộ đếm hiệu ứng độ phân giải cao là gì?

"Bộ hẹn giờ hiệu suất có độ phân giải cao" là gì? Nó có được hỗ trợ bởi phần cứng không? Những hệ thống nào không hỗ trợ nó?

Trả lời

4

Dưới Windows 7 trên bộ vi xử lý thế hệ hiện tại, đây là bộ đếm thời gian chính xác cao (nanosecond) đáng tin cậy bên trong CPU (HPET).

Theo các phiên bản trước và trên các thế hệ vi xử lý trước đó, đó là "cái gì đó", có nghĩa là khá nhiều mọi thứ. Thông thường nhất, nó là giá trị được trả về bởi lệnh RDTSC (hoặc một giá trị tương đương, trên non-x86), có thể hoặc không đáng tin cậy và không phụ thuộc vào đồng hồ. Lưu ý rằng RDTSC (ban đầu, theo định nghĩa, nhưng không phải bây giờ nữa) không đo lường thời gian, nó đo lường chu kỳ.

Trên các CPU hiện tại-và-thế hệ trước, RDTSC thường là đáng tin cậy và đồng hồ độc lập (tức là bây giờ nó là thực sự thời gian đo), trên trước hệ -previous, đặc biệt là trên điện thoại di động hoặc một số đa cpu giàn khoan nó không phải là. Các "bộ đếm thời gian" có thể tăng tốc và giảm tốc, và thậm chí là khác nhau trên các CPU khác nhau, gây ra "du hành thời gian".

Edit: Các constant tsc cờ trong CPUID (0x80000007) có thể được sử dụng để nói cho dù RDTSC là đáng tin cậy hay không (mặc dù điều này không thực sự giải quyết vấn đề, bởi vì phải làm gì nếu nó không phải là, nếu có không có thay thế...).

Trên các hệ thống cũ hơn (như, 8-10 tuổi), một số bộ tính giờ khác có thể được sử dụng cho QueryPerformanceCounter. Những người có thể không có độ phân giải cao ở tất cả, cũng không được terribly chính xác.

+0

Re: "Lưu ý rằng RDTSC không đo thời gian, nó đo chu kỳ.", Điều quan trọng cần lưu ý là bạn có thể tính thời gian tính bằng giây trực tiếp là 'dấu * fres '. – Polynomial

+1

@ Đa thức: Không, bạn không thể, vì freq! = Const. Trên khá nhiều hệ thống _every_ ngày nay (và hầu hết các hệ thống trong nửa thập kỷ qua) tần số đang được tự động thu nhỏ để tiết kiệm điện. – Damon

+0

Thú vị. Phương án thay thế là gì? – Polynomial

1

Bộ đếm hiệu suất có độ phân giải cao thường được lấy từ lệnh rdtsc, đây là cách x86 cụ thể để tìm nạp số lượng CPU đã xảy ra kể từ khi khởi động. Giá trị của nó là rất chính xác, thường xuống đến 100ns chính xác.

So sánh điều này với GetTickCount(), có độ chính xác khoảng ~ 16ms.

Trên các kiến ​​trúc khác (nằm ngoài phạm vi của các API Win32, vì chúng chỉ chạy trên các tập lệnh dựa trên x86) có thể có nhiều cách khác nhau để thực hiện việc này. Ví dụ, trên ARM, bạn có thể sử dụng Bộ điều khiển Hệ thống (CP15) để làm điều gì đó tương tự.

+0

+1 cho 'thường' là tối đa HAL để quyết định sử dụng –

+0

@AlexK. - Ừ, cuối cùng nó cũng thuộc về HAL. Tuy nhiên, trên x86, tôi không thấy lý do gì để sử dụng thứ gì khác ngoài rdtsc vì nó rất chính xác. Nếu tôi nhớ chính xác, nó sử dụng cùng một nguồn đồng hồ được sử dụng để chạy ngắt, đó là ludicrously accuratly. – Polynomial

+0

@ Đa thức: Xem câu trả lời của tôi vì lý do chính đáng tại sao không nên sử dụng RDTSC, trừ khi bạn được đảm bảo rằng khách hàng của bạn không sử dụng CPU có thể là 4 hoặc 5 tuổi. RDTSC chỉ chính xác và chính xác trên các CPU _some_, không nhất thiết phải tất cả (và bạn thực sự không thể kiểm soát được chương trình mà CPU của bạn chạy). – Damon

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