Як отримати час, що минув у С в мілісекундах? (Windows)

Я шукав в Інтернеті, але я тільки знайшов спосіб зробити це, але таким чином він повертається в секундах замість мілісекунд.

Мій код:

#include 
#include 
#include 

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

8 Відповіді

Перехресним способом є використання ftime.

Windows specific link here: http://msdn.microsoft.com/en-us/library/aa297926(v=vs.60).aspx

Приклад нижче.

#include 
#include  

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 і побачив, що насправді викликає вікна GetSystemTimeAsFileTime функції.

У будь-якому випадку ftime надасть точність у мілісекундах.

22
додано
Відповідно до man7.org/linux/man-pages/man3/ftime. 3.html , ftime() є застарілим. Можливо, кращим крос-платформним рішенням буде використання std :: chrono .
додано Автор erobertc, джерело
@erobertc Операційній системі потрібне рішення для C , а не C ++ . Ваша пропозиція вимагає C ++ .
додано Автор rbaleksandar, джерело

Перехресним способом є використання ftime.

Windows specific link here: http://msdn.microsoft.com/en-us/library/aa297926(v=vs.60).aspx

Приклад нижче.

#include 
#include  

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 і побачив, що насправді викликає вікна GetSystemTimeAsFileTime функції.

У будь-якому випадку ftime надасть точність у мілісекундах.

22
додано
Відповідно до man7.org/linux/man-pages/man3/ftime. 3.html , ftime() є застарілим. Можливо, кращим крос-платформним рішенням буде використання std :: chrono .
додано Автор erobertc, джерело
@erobertc Операційній системі потрібне рішення для C , а не C ++ . Ваша пропозиція вимагає C ++ .
додано Автор rbaleksandar, джерело

Рішення нижче мені здається нормальним. Як ти гадаєш?

#include 
#include 

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

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

9
додано
ви повинні бути обережні у використанні clock() у багатопотоковій програмі, оскільки воно повертає "CPU-час, споживаний програмою", а не час, що минув
додано Автор Ameer Jewdaki, джерело
у цьому рядку не можна використовувати timediff : elapsed = timediff (t1, t2); , якщо не визначено правильний файл заголовка. Просто t2-t1 буде працювати нормально.
додано Автор inckka, джерело
Ви праві. Вибачте за недбале непорозуміння.
додано Автор inckka, джерело
@inckka, timediff() визначається безпосередньо над main() . Файл заголовка не потрібний. І t2-t1 не дасть вам відповіді в мілісекундах.
додано Автор mcrisc, джерело

Для Windows GetSystemTime() - це те, що потрібно. Для POSIX, gettimeofday() .

2
додано

Для Windows GetSystemTime() - це те, що потрібно. Для POSIX, gettimeofday() .

2
додано

GetSystemTime() uses the structure SYSTEMTIME, which provides milli-second resolution.

More on this here.

1
додано

GetSystemTime() uses the structure SYSTEMTIME, which provides milli-second resolution.

More on this here.

1
додано

Цей код працює. Це базується на відповіді від Angus Comber:

#include 

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
}
1
додано