2011-12-05 8 views
5

Có cách nào lấy thời gian hệ thống có độ chính xác cao trong python không?Thời gian hệ thống chính xác cao ở trăn

Tôi có một ứng dụng nhỏ để làm việc với cổng COM ảo. Tôi muốn đo khoảng thời gian giữa việc gửi tin nhắn và nhận tin nhắn.

Tại thời điểm nó hoạt động như thế này:

tôi có được tin nhắn, sử dụng

time.time() 

và thêm 20 chữ số của nó vào tin nhắn. Ứng dụng khách nhận được thông báo này và nhận được

time.time() 

một lần nữa, sau đó tính toán sự khác biệt của chúng. Ở hầu hết các trường hợp, khoảng thời gian (như tôi mong đợi) bằng không.

Câu hỏi đặt ra là: có cách nào thực hiện điều này một cách thông minh hơn và chính xác hơn không?

+0

Nếu người gửi và người nhận là trên các máy khác nhau, làm thế nào để bạn xử lý các timebases khác nhau? Trong bất kỳ trường hợp nào, trình điều khiển cổng nối tiếp sẽ gửi cho bạn thông báo bất cứ khi nào nó cảm thấy giống như vậy, điều này cực kỳ thay đổi (10 của mili giây, theo kinh nghiệm của tôi). – mtrw

+0

người gửi và người nhận trên cùng một máy (tôi đang sử dụng cổng COM ảo). chương trình được viết cho mục đích giáo dục, vì vậy tôi hỏi nếu có một cách thông minh để giải quyết vấn đề này –

+0

liên quan: http://bugs.python.org/issue10278 [time.walltime() in C] (http: // bug.python.org/review/10278/patch/3730/11849), [trong Python call clock_gettime() sử dụng ctypes] (http://stackoverflow.com/a/1205762/4279) – jfs

Trả lời

2

Dưới đây là một đoạn trích từ time.clock

Trên Unix, trả lại thời gian xử lý hiện tại như một số dấu chấm động bày tỏ trong vài giây. Độ chính xác và trên thực tế, định nghĩa của “thời gian xử lý” là , phụ thuộc vào chức năng của C cùng tên, nhưng trong mọi trường hợp, đây là chức năng để sử dụng để đo điểm chuẩn Python hoặc thuật toán thời gian.

Trên Windows, hàm này trả về số giây đồng hồ treo tường kể từ lần gọi hàm đầu tiên, dưới dạng số dấu phẩy động, dựa trên hàmhàm Win32 QueryPerformanceCounter(). Độ phân giải là thường là tốt hơn một micro giây.

(nhấn mạnh mỏ)

+0

cảm ơn rất nhiều câu trả lời của bạn, nhưng ứng dụng khách và ứng dụng người gửi hoạt động như các quy trình khác nhau. vì vậy, làm thế nào tôi có thể sử dụng chức năng này để tính toán khoảng thời gian? –

+0

Tôi thực sự không thể nói. Cơ hội tốt nhất sẽ có khối '' 'send''' cho đến khi nhận được tin nhắn, vì vậy bạn có thể nắm bắt thời gian trước và sau. Một cách để làm điều này sẽ là một câu trả lời nhưng điều đó sẽ ảnh hưởng đến kết quả của bạn. Tùy chọn khác là gửi một thông điệp rất dài mà sẽ mất vài phút để truyền, do đó '' 'time.time()' '' sẽ có đủ độ chính xác. Tôi thực sự hy vọng một người nào đó tìm thấy một giải pháp tốt hơn ... – FakeRainBrigand

+0

Hiệu chỉnh QueryPerformanceThời gian chống lại thời gian.khi bắt đầu mã của bạn, do đó dấu thời gian bạn gửi sẽ là phiên bản độ chính xác cao của time.time(). Đáng để thử! –