2011-12-20 39 views
6

Tôi đang chuyển ứng dụng của mình sang windows từ unix và tôi đã chạy vào tường. Trong ứng dụng của tôi, tôi cần phải tìm thời gian trong micro giây (toàn bộ ứng dụng phụ thuộc rất nhiều vào nó do nó là một ứng dụng có độ chính xác cao).timespec tương đương với các cửa sổ

Trước đây tôi đã sử dụng cấu trúc timespec, nhưng cửa sổ không chứa những thứ như vậy. Lệnh GetTickCount không đủ bởi vì nó trả về thời gian tính bằng mili giây. Tôi cũng đã suy nghĩ về QueryPerformanceFrequency.

Có ai muốn biết điều gì đó giống hệt như timespec càng tốt, trong tương lai tôi thậm chí có thể yêu cầu nano giây, không có gì tôi đã tìm kiếm trong các cửa sổ hỗ trợ.

Nhờ ai giúp đỡ họ

+0

Có vấn đề gì với QueryPerformanceCounter? – kichik

+0

@kichik Tôi nghe nói rằng nó hoạt động mạnh khi được sử dụng với một cpu lõi kép. Không biết nếu nó là hoàn toàn đúng hay không – Quillion

+0

Thời gian chạy mới (đi kèm với vs2015, v14.0.xyz) bao gồm tiêu đề xác định loại timespec (thực tế là ba loại khác nhau: _timespec32, _timespec64 và timespec). Thật không may, không có macro đi kèm (ví dụ, _TIMESPEC_DEFINED) để kiểm tra sự hiện diện của loại này (argh). –

Trả lời

10

Xem, ví dụ, How to realise long-term high-resolution timing on windows using C++?C++ Timer function to provide time in nano seconds.

Tôi đã thực hiện một số thử nghiệm với Cygwin trong Windows XP: trên máy của tôi, độ chi tiết của gettimeofday() là khoảng 15 msecs (~ 1/64 giây). Đó là khá thô. Và như vậy là granularity của:

* clock_t clock(void) (divisor CLOCKS_PER_SEC) 
* clock_t times(struct tms *) (divisor sysconf(_SC_CLK_TCK)) 

Cả hai ước là 1000 (POSIX có 1000000 cho đầu tiên).

Đồng thời, clock_getres (CLOCK_REALTIME, ...) trả về 15 mili giây, vì vậy clock_gettime() không có khả năng trợ giúp. Và CLOCK_MONOTONIC và CLOCK_PROCESS_CPUTIME_ID không hoạt động.

Các tiện ích khác cho Windows có thể là RDTSC; xem bài viết trên Wikipedia. Và HPET, không khả dụng với Windows XP.

Cũng lưu ý trong Linux, đồng hồ() là thời gian xử lý, trong khi trong Windows là thời gian trên tường.

Vì vậy, một số mẫu mã, cho cả tiêu chuẩn Unix, và cho mã Cygwin chạy trong môi trường Windows, mang đến cho một granularity khoảng 50 microsecs (trên máy của tôi). Giá trị trả về bằng giây và cho số giây trôi qua kể từ khi hàm được gọi đầu tiên. (Tôi muộn màng nhận ra điều này là trong một câu trả lời tôi đã giao hơn a year ago).

#ifndef __CYGWIN32__ 
double RealElapsedTime(void) { // returns 0 seconds first time called 
    static struct timeval t0; 
    struct timeval tv; 
    gettimeofday(&tv, 0); 
    if (!t0.tv_sec) 
     t0 = tv; 
    return tv.tv_sec - t0.tv_sec + (tv.tv_usec - t0.tv_usec)/1000000.; 
} 
#else 
#include <windows.h> 
double RealElapsedTime(void) { // granularity about 50 microsecs on my machine 
    static LARGE_INTEGER freq, start; 
    LARGE_INTEGER count; 
    if (!QueryPerformanceCounter(&count)) 
     FatalError("QueryPerformanceCounter"); 
    if (!freq.QuadPart) { // one time initialization 
     if (!QueryPerformanceFrequency(&freq)) 
     FatalError("QueryPerformanceFrequency"); 
     start = count; 
    } 
    return (double)(count.QuadPart - start.QuadPart)/freq.QuadPart; 
} 
#endif 
+0

Tất cả trong tất cả nó có vẻ như một câu trả lời chắc chắn, nhưng tôi không thể có vẻ để tìm ra lý do tại sao một giá trị gấp đôi sẽ được trả lại hoặc những gì nó sẽ đại diện.Tôi hiểu rằng bạn tìm thấy sự khác biệt và sau đó chia cho tần số. Vì vậy, nếu tôi giả định rằng giá trị gấp đôi tính bằng giây, thì để tìm micro giây tôi phải nhân với 1 triệu (1 000 000). Có đúng không? – Quillion

+0

Giá trị trả về bằng 'giây' và cho số giây trôi qua kể từ khi hàm được gọi đầu tiên. –

+0

Hướng dẫn [GNU C Lib Manual] (http://www.gnu.org/s/hello/manual/libc/Elapsed-Time.html) có một số hệ điều hành đặc biệt mà thành viên tv_sec có loại không dấu "' Đối với những điều này, mã trên cần một diễn viên, hoặc giả định rằng đồng hồ không bao giờ chạy ngược. –

2

Di động giữa Windows, UNIX, Linux và mọi thứ mơ hồ hiện đại: std::chrono::high_resolution_clock. Độ phân giải có thể thay đổi, nhưng bạn có thể tìm hiểu tại thời điểm biên dịch nó là gì. Nanoseconds là chắc chắn có thể trên phần cứng hiện đại.

Hãy nhớ rằng độ chính xác nano giây thực sự có nghĩa là độ chính xác của đồng hồ phụ. Một nano giây tại lightspeed chỉ là 30 cm. Di chuyển máy tính của bạn từ trên cùng của rack xuống phía dưới là nghĩa đen di chuyển nó bằng vài nano giây.

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