2013-06-22 13 views
6

Szukałem w sieci, ale znalazłem tylko sposób, aby to zrobić, ale w ten sposób powraca w sekundach zamiast milisekund.Jak uzyskać czas, który upłynął w C w milisekundach? (Windows)

Mój kod to:

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

Odpowiedz

20

Sposób na wiele platform polega na użyciu czasu ftime.

Okna specyficzny związek tutaj: http://msdn.microsoft.com/en-us/library/aa297926(v=vs.60).aspx

Przykład poniżej.

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

Pobiegłem powyższy kod i śledzone przez niego przy użyciu VS2008 i zobaczył to rzeczywiście wywołuje funkcję okna GetSystemTimeAsFileTime.

W każdym razie, ftime da ci dokładność milisekund.

+0

Według http://man7.org/linux/man-pages/man3/ftime.3.html, ftime() jest przestarzała. Być może lepszym rozwiązaniem wieloplatformowym byłoby korzystanie z biblioteki ['std :: chrono'] (http://en.cppreference.com/w/cpp/chrono). – erobertc

+4

@erobertc OP potrzebuje rozwiązania dla 'C', a nie' C++ '. Twoja sugestia wymaga 'C++'. – rbaleksandar

1

GetSystemTime() wykorzystuje strukturę SYSTEMTIME, który zapewnia rozdzielczość Milli-sekundowy.

More on this here.

1

Dla Windows, GetSystemTime() jest tym, czego potrzebujesz. Dla POSIX, gettimeofday().

9

Rozwiązanie poniżej wydaje mi się OK. Co myślisz?

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

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

+0

nie można użyć 'timediff' w tym wierszu:' elapsed = timediff (t1, t2); ' , chyba że zdefiniowano poprawny plik nagłówkowy. Po prostu 't2-t1' będzie działać poprawnie. – inckka

+1

@inckka, 'timediff()' jest zdefiniowany bezpośrednio powyżej 'main()'. Nie jest potrzebny plik nagłówkowy. Natomiast 't2-t1' nie da ci odpowiedzi w milisekundach. – mcrisc

+0

masz rację. Przepraszamy za nieostrożne nieporozumienie. – inckka

0

Ten fragment kodu działa. Jest to oparte na odpowiedź od 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 
} 
Powiązane problemy