Xem, ví dụ, How to realise long-term high-resolution timing on windows using C++? và 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
Nguồn
2011-12-20 23:39:11
Có vấn đề gì với QueryPerformanceCounter? – kichik
@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
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). –