C: использование clock () для измерения времени в многопоточных программах - PullRequest
45 голосов
/ 03 июня 2010

Я всегда использовал clock (), чтобы измерить, сколько времени заняло мое приложение от начала до конца, as;

int main(int argc, char *argv[]) {
  const clock_t START = clock();

  // ...

  const double T_ELAPSED = (double)(clock() - START) / CLOCKS_PER_SEC;
}

С тех пор, как я начал использовать потоки POSIX, это похоже на ошибку. Похоже, что clock () увеличивается в N раз быстрее с N потоков. Поскольку я не знаю, сколько потоков будет работать одновременно, этот подход не работает. Так как я могу измерить, сколько времени прошло?

Ответы [ 2 ]

98 голосов
/ 03 июня 2010

clock() измеряет время процессора, используемое вашим процессом, а не время настенных часов. Если у вас одновременно запущено несколько потоков, очевидно, что вы можете сжечь процессорное время гораздо быстрее.

Если вы хотите узнать время выполнения настенных часов, вам нужно использовать соответствующую функцию. Единственный в ANSI C - time(), разрешение которого обычно составляет всего 1 секунду.

Однако, как вы сказали, вы используете POSIX, это означает, что вы можете использовать clock_gettime(), определенный в time.h. Для этого лучше всего использовать часы CLOCK_MONOTONIC:

struct timespec start, finish;
double elapsed;

clock_gettime(CLOCK_MONOTONIC, &start);

/* ... */

clock_gettime(CLOCK_MONOTONIC, &finish);

elapsed = (finish.tv_sec - start.tv_sec);
elapsed += (finish.tv_nsec - start.tv_nsec) / 1000000000.0;

(Обратите внимание, что я тщательно вычислил elapsed, чтобы не потерять точность при очень коротких интервалах).

Если ваша ОС не предоставляет CLOCK_MONOTONIC (который вы можете проверить во время выполнения с помощью sysconf(_SC_MONOTONIC_CLOCK)), тогда вы можете использовать CLOCK_REALTIME в качестве запасного варианта - но учтите, что у последней есть недостаток, заключающийся в том, что она генерирует некорректно результаты, если системное время изменяется во время работы вашего процесса.

1 голос
/ 03 июня 2010

Какое временное разрешение вам нужно? Вы можете использовать time () из time.h для второго разрешения. Если вам нужно более высокое разрешение, вы можете использовать что-то более системное. См. Функция таймера для предоставления времени в нано секундах с использованием C ++

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