Портативный способ подсчета миллисекунд в C ++? - PullRequest
4 голосов
/ 09 июня 2010

Существует ли какой-либо переносимый (Windows & Linux) способ подсчета количества миллисекунд, прошедших между двумя вызовами?

По сути, я хочу достичь той же функциональности, что и класс StopWatch класса .NET.(для тех, кто уже использовал его)

В идеальном мире я бы использовал boost::date_time, но это не вариант здесь из-за некоторых глупых правил, которые я вынужден соблюдать.

Для тех, кто лучше читает код, это то, чего я хотел бы достичь.

Timer timer;

timer.start();
// Some instructions here
timer.stop();

// Print out the elapsed time
std::cout << "Elapsed time: " << timer.milliseconds() << "ms" << std::endl;

Так что, если есть переносимая (ие) функция (и), которая может помочь мне реализовать Timerкласс, что это?Если такой функции нет, какой API для Windows и Linux следует использовать для достижения этой функции?(используя #ifdef WINDOWS -подобные макросы)

Спасибо!

Ответы [ 4 ]

4 голосов
/ 09 июня 2010

В Linux (и обычно в POSIX) вы можете использовать функцию gettimeofday, которая возвращает количество микросекунд с начала эпохи. В Windows есть функция GetTickCount, которая возвращает количество миллисекунд с момента запуска системы.

2 голосов
/ 09 июня 2010

clock () (в Time.h) возвращает значение, которое увеличивается CLOCKS_PER_SEC каждую секунду, обычно 1000.

0 голосов
/ 09 июня 2010

Это мой код для этой задачи (Повышенная лицензия). Где ptime - это класс, представляющий время в секундах + наносекунды ptime(int sec,int nano)

И ptime :: микросекунды создают пару сек / нано из микросекунд времени посикс.1004 *

Довольно просто переписать его для своих нужд и написать такой класс.

ptime ptime::now()
{
    #ifndef BOOSTER_WIN_NATIVE
    struct timeval tv;
    gettimeofday(&tv,0);
    return ptime(tv.tv_sec,tv.tv_usec * 1000);
    #else
    FILETIME ft;
    GetSystemTimeAsFileTime(&ft);
    unsigned long long tt = ft.dwHighDateTime;
    tt <<=32;
    tt |= ft.dwLowDateTime;
    tt /=10;
    tt -= 11644473600000000ULL;
    return ptime(ptime::microseconds(tt));
    #endif
}

И для этого нет переносимой функции C ++ ...

0 голосов
/ 09 июня 2010

В Windows используйте высокопроизводительный таймер, это пустяк.

LARGE_INTEGER frequency;
LARGE_INTEGER one;
LARGE_INTEGER two;
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&one);
// something
QueryPerformanceCounter(&two);
std::cout << (((double)two.QuadPart - (double)one.QuadPart) / (double)frequency.QuadPart) * (double)1000;

Теоретически, это может привести к точности за такт, в зависимости от рассматриваемого процессора.

...