2013-06-22 71 views
6

我在網上搜索過,但我只找到了一個辦法,但以這種方式它返回的秒數而不是毫秒。如何獲得以毫秒爲單位的C所花費的時間? (Windows)

我的代碼是:

#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; 
} 

回答

20

跨平臺的方式是使用ftime。

Windows特定鏈接的位置:下方http://msdn.microsoft.com/en-us/library/aa297926(v=vs.60).aspx

例。

#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; 
} 

我跑了上面的代碼,並使用VS2008通過它追蹤,看到它實際上調用Windows GetSystemTimeAsFileTime功能。

無論如何,ftime會給你毫秒的精度。

+0

根據http://man7.org/linux/man-pages/man3/ftime.3.html,ftime()已過時。也許更好的跨平臺解決方案是使用['std :: chrono'](http://en.cppreference.com/w/cpp/chrono)庫。 – erobertc

+4

@erobertc OP需要一個'C'解決方案,而不是'C++'。你的建議需要'C++'。 – rbaleksandar

1

對於Windows,GetSystemTime()是你想要的。對於POSIX,gettimeofday()

9

下面的解決方案似乎對我很好。你怎麼看?

#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; 
} 

參考:http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.15.html#clock

+0

您不能在此行使用'timediff':'elapsed = timediff(t1,t2);' 除非定義了正確的頭文件。 只是't2-t1'會正常工作。 – inckka

+1

@inckka,'timediff()'定義在'main()'的正上方。不需要頭文件。而't2-t1'不會以毫秒爲單位給出答案。 – mcrisc

+0

你是對的。對不小心的誤會抱歉。 – inckka

0

此代碼塊的工作。這是基於安格斯精梳機的回答:

#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 
} 
相關問題