C: использование часов () для измерения времени в многопоточных программах

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

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

  // ...

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

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

48
задан Suugaku 3 June 2010 в 01:23
поделиться

2 ответа

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;

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

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

103
ответ дан 26 November 2019 в 18:41
поделиться

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

1
ответ дан 26 November 2019 в 18:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: