Как я могу получить время выполнения программы в миллисекундах в C? - PullRequest
10 голосов
/ 07 февраля 2010

В настоящее время я получаю время выполнения моей программы в секундах , вызывая:

time_t startTime = time(NULL);
//section of code
time_t endTime = time(NULL);
double duration = difftime(endTime, startTime);

Возможно ли получить время стены в миллисекундах ? Если так, то как?

Ответы [ 6 ]

9 голосов
/ 07 февраля 2010

Если вы работаете на POSIX-машине, используйте gettimeofday(); это дает вам разумную мобильность и микросекундное разрешение.

Немного более эзотерической, но также и в POSIX, является функция clock_gettime(), которая дает вам наносекундное разрешение.

Во многих системах вы найдете функцию ftime(), которая фактически возвращает вам время в секундах и миллисекундах. Однако его больше нет в спецификации Single Unix (примерно так же, как в POSIX). Вам нужен заголовок <sys/timeb.h>:

struct timeb mt;
if (ftime(&mt) == 0)
{
     mt.time ... seconds
     mt.millitime ... milliseconds
}

Это относится, по крайней мере, к Unix версии 7 (или 7-й редакции), поэтому он был очень широко доступен.

У меня также есть примечания в коде моего секундного таймера на times() и clock(), которые снова используют другие структуры и заголовки. У меня также есть заметки о том, что Windows использует clock() с 1000 тактов в секунду (миллисекундная синхронизация) и более старый интерфейс GetTickCount(), который отмечен как необходимый в Windows 95, но не в NT.

3 голосов
/ 07 февраля 2010

Я недавно написал пост в блоге, который объясняет , как получить время в кроссплатформенном времени в миллисекундах .

Это будет работать как время (NULL), но будет возвращать количество миллисекунд вместо секунд с эпохи Unix как в Windows, так и в Linux.

Вот код

#ifdef WIN32
#include <Windows.h>
#else
#include <sys/time.h>
#include <ctime>
#endif

/* Returns the amount of milliseconds elapsed since the UNIX epoch. Works on both
 * windows and linux. */

int64 GetTimeMs64()
{
#ifdef WIN32
 /* Windows */
 FILETIME ft;
 LARGE_INTEGER li;
 uint64 ret;

 /* Get the amount of 100 nano seconds intervals elapsed since January 1, 1601 (UTC) and copy it
  * to a LARGE_INTEGER structure. */
 GetSystemTimeAsFileTime(&ft);
 li.LowPart = ft.dwLowDateTime;
 li.HighPart = ft.dwHighDateTime;

 ret = li.QuadPart;
 ret -= 116444736000000000LL; /* Convert from file time to UNIX epoch time. */
 ret /= 10000; /* From 100 nano seconds (10^-7) to 1 millisecond (10^-3) intervals */

 return ret;
#else
 /* Linux */
 struct timeval tv;
 uint64 ret;

 gettimeofday(&tv, NULL);

 ret = tv.tv_usec;
 /* Convert from micro seconds (10^-6) to milliseconds (10^-3) */
 ret /= 1000;

 /* Adds the seconds (10^0) after converting them to milliseconds (10^-3) */
 ret += (tv.tv_sec * 1000);

 return ret;
#endif
}

Вы можете изменить его, чтобы он возвращал микросекунды вместо миллисекунд, если хотите.

3 голосов
/ 07 февраля 2010

Если вы можете сделать это вне самой программы, в Linux вы можете использовать команду time (time ./my_program).

0 голосов
/ 07 февраля 2010

gprof, который является частью набора инструментов GNU, является опцией. На большинстве систем POSIX он установлен, и он доступен в Cygwin для Windows. Слежение за временем с помощью gettimeofday() работает нормально, но это производительность, эквивалентная использованию операторов print для отладки. Хорошо, если вы просто хотите быстрое и грязное решение, но оно не так элегантно, как использование подходящих инструментов.

Чтобы использовать gprof, вы должны указать опцию -pg при компиляции с gcc как в:

gcc -o prg source.c -pg

Затем вы можете запустить gprof в сгенерированной программе следующим образом:

gprof prg > gprof.out

По умолчанию gprof будет генерировать общее время выполнения вашей программы, а также количество времени, затрачиваемого на каждую функцию, количество вызовов каждой функции, среднее время, потраченное на каждый вызов функции, и аналогичную информацию.

Существует большое количество опций, которые вы можете установить с помощью gprof. Если вам интересно, вы можете найти дополнительную информацию на страницах руководства или в Google.

0 голосов
/ 07 февраля 2010

Библиотека GLib с открытым исходным кодом имеет систему GTimer, которая утверждает, что обеспечивает микросекундную точность. Эта библиотека доступна в Mac OS X, Windows и Linux. В настоящее время я использую его для измерения производительности в Linux, и, похоже, он отлично работает.

0 голосов
/ 07 февраля 2010

В Windows используйте QueryPerformanceCounter и связанную с ним QueryPerformanceFrequency. Они не дают вам время, которое можно перевести на календарное время, поэтому, если вам нужно, спросите время, используя CRT API, а затем немедленно используйте QueryPerformanceCounter. Затем вы можете сделать некоторое простое сложение / вычитание для вычисления календарного времени с некоторой ошибкой из-за времени, которое требуется для последовательного выполнения API. Эй, это ПК, что ты ожидал ???

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...