2013-06-22 43 views
6

Tôi đã tìm kiếm trên Web nhưng tôi chỉ tìm thấy cách để thực hiện, nhưng theo cách này, nó sẽ trả về sau vài giây thay vì mili giây.Làm cách nào để có thời gian trôi qua trong C tính bằng mili giây? (Windows)

Mã của tôi là:

#include <stdio.h> 
#include <assert.h> 
#include <time.h> 

int main(void) 
{ 
    int solucion; 

    time_t start, stop; 
    clock_t ticks; 
    long count; 

    time(&start); 
    solucion = divisores_it(92000000, 2); 
    time(&stop); 

    printf("Finnished in %f seconds. \n", difftime(stop, start)); 
    return 0; 
} 

Trả lời

20

Cách nền tảng chéo là sử dụng thời gian.

Liên kết cụ thể của Windows tại đây: http://msdn.microsoft.com/en-us/library/aa297926(v=vs.60).aspx

Ví dụ bên dưới.

#include <stdio.h> 
#include <sys\timeb.h> 

int main()  
{ 
    struct timeb start, end; 
    int diff; 
    int i = 0; 
    ftime(&start); 

    while(i++ < 999) { 
     /* do something which takes some time */ 
     printf(".");  
    } 

    ftime(&end); 
    diff = (int) (1000.0 * (end.time - start.time) 
     + (end.millitm - start.millitm)); 

    printf("\nOperation took %u milliseconds\n", diff); 
    return 0; 
} 

Tôi đã chạy mã ở trên và truy tìm qua nó bằng cách sử dụng VS2008 và thấy nó thực sự gọi hàm GetSystemTimeAsFileTime của windows.

Dù sao, thời gian chờ sẽ cho bạn độ chính xác mili giây.

+0

Theo http://man7.org/linux/man-pages/man3/ftime.3.html, ftime() đã lỗi thời. Có lẽ một giải pháp nền tảng tốt hơn sẽ là sử dụng thư viện ['std :: chrono'] (http://en.cppreference.com/w/cpp/chrono). – erobertc

+4

@erobertc OP cần giải pháp cho 'C' chứ không phải' C++ '. Đề xuất của bạn yêu cầu 'C++'. – rbaleksandar

1

GetSystemTime() sử dụng cấu trúc SYSTEMTIME, cung cấp độ phân giải milli giây.

More on this here.

1

Đối với Windows, GetSystemTime() là những gì bạn muốn. Đối với POSIX, gettimeofday().

9

Giải pháp dưới đây có vẻ ổn với tôi. Bạn nghĩ sao?

#include <stdio.h> 
#include <time.h> 

long timediff(clock_t t1, clock_t t2) { 
    long elapsed; 
    elapsed = ((double)t2 - t1)/CLOCKS_PER_SEC * 1000; 
    return elapsed; 
} 

int main(void) { 
    clock_t t1, t2; 
    int i; 
    float x = 2.7182; 
    long elapsed; 

    t1 = clock(); 
    for (i=0; i < 1000000; i++) { 
      x = x * 3.1415; 
    } 
    t2 = clock(); 

    elapsed = timediff(t1, t2); 
    printf("elapsed: %ld ms\n", elapsed); 


    return 0; 
} 

tham khảo: http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.15.html#clock

+0

bạn không thể sử dụng 'timediff' trong dòng này:' elapsed = timediff (t1, t2); ' trừ khi xác định tệp tiêu đề chính xác. Chỉ cần 't2-t1' sẽ hoạt động tốt. – inckka

+1

@inckka, 'timediff()' được định nghĩa ngay trên 'main()'. Không cần tệp tiêu đề. Và 't2-t1' sẽ không trả lời bạn bằng mili giây. – mcrisc

+0

bạn là chính xác. Xin lỗi vì sự hiểu lầm bất cẩn. – inckka

0

mảnh Mã này hoạt động. Điều này dựa trên câu trả lời từ Angus Comber:

#include <sys/timeb.h> 

uint64_t system_current_time_millis() 
{ 
#if defined(_WIN32) || defined(_WIN64) 
    struct _timeb timebuffer; 
    _ftime(&timebuffer); 
    return (uint64_t)(((timebuffer.time * 1000) + timebuffer.millitm)); 
#else 
    struct timeb timebuffer; 
    ftime(&timebuffer); 
    return (uint64_t)(((timebuffer.time * 1000) + timebuffer.millitm)); 
#endif 
} 
Các vấn đề liên quan